js超大整数字符串相加运算

171 阅读2分钟

// https://www.jianshu.com/p/c51d63028371
const numMax = Number.MAX_VALUE // 1.7976931348623157e+308
const numMaxSafe = Number.MAX_SAFE_INTEGER // 9007199254740991
const numMin = Number.MIN_VALUE // 5e-324
const numMinSafe = Number.MIN_SAFE_INTEGER // -9007199254740991

console.log('numMax', numMax);
console.log('numMaxSafe', numMaxSafe);
console.log('numMin', numMin);
console.log('numMinSafe', numMinSafe);

// numMax 1.7976931348623157e+308
// numMaxSafe 9007199254740991
// numMin 5e-324
// numMinSafe -9007199254740991

// jianshu.com/p/c51d63028371

function sumBigNumber (a, b) {
    let res = '';
    let temp = 0;
    a = a.split('');
    b = b.split('');
    while (a.length || b.length || temp) {
        temp += ~~a.pop() + ~~b.pop();
        res = (temp % 10) + res;
        temp = temp > 9;
    }
    return res.replace(/^0+/, '');
}

console.log("sumBigNumber('10', '10')", sumBigNumber('10', '10'));
console.log("sumBigNumber('100000000000002222', '1111')", sumBigNumber('100000000000002222', '1111'));


// 首先我们用字符串的形式来保存大数,就保证了其在数学表示上不会发生变化
// 初始化res, temp变量来保存中间计算的结果,在将两个字符串split为数组,以便我们进行每一位的运算
// 循环的第一次就是进行 "个位" 的运算,将二者最末尾的两个数相加,由于每一位数字是0 - 9,所以需要进行进位,在进过取余数操作后,将结果保留在个位。
// 判断 temp 是否大于 10,若是则将 temp 赋值为 true,等等,为什么要赋值成布尔值,不要着急,魔法即将发生。
// 在两个大数中的一个还有数字没有参与运算,或者前一次运算发生进位后,进行下一次循环。
// 接着除了对新的两个数字相加还要加上 temp,若上次发生了进位,则此时 temp 为 true,Js因为存在隐式转换,所以 true 转换为 1,我们借用 Js 的类型转换,完成了逻辑上的逢10进1操作。Amazing
// 接下来就是重复上述的操作,直到计算结束。