大正整数相加问题

155 阅读1分钟

超出存储范围的大正整数相加

背景

  • 计算机存储数字的能力有限,它不能存储很大的数字,到了一定的位数之后会丢失精度。JS里面可以通过Number.MAX_SAFE_INTEGER属性能拿到可存储的最大整数,超过这个值再进行运算会出现问题。
    console.log(Number.MAX_SAFE_INTEGER);//9007199254740991

函数执行

/**
* 大整数相加(超出存储范围的大正整数)
* @param {String} a
* @param {String} b
* @returns String
*/

function sum(a, b) {
    // 获取字符中最大长度
    const len = Math.max(a.length,b.length);
    
    // 补全字符长度
    a = a.padStart(len, "0");
    b = b.padStart(len, "0");
    
    // 控制进位
    let carry = 0;
    
    let result = "";
    for (let i = len - 1; i >= 0; i--) {
        // 转数字运算
        const sum = +a[i] + +b[i] + carry;
        result = (sum % 10) + result;
        carry = Math.floor(sum / 10);
    }
    // 判断进位是否存在,以免出现第一位为0
    result = carry ? carry + result : result;
    return result;
}

padStart:用另一个字符填充当前字符,从左侧开始填充 语法:str.padStart(targetLength,padString),参数分别是目标长度、填充字符。

资料补充