JS 大整数相加

在JavaScript中处理大整数相加时,由于JavaScript的Number类型是基于IEEE 754标准的双精度64位浮点格式,它只能安全地表示从-(2^53 - 1)到2^53 - 1(大约是-9007199254740991到9007199254740991)之间的整数。超出这个范围的整数在进行加法运算时可能会失去精度,导致不正确的结果。

解决方案

1. 使用字符串进行大数运算

对于大整数的加法,你可以将数字转换为字符串,然后逐字符相加,最后将结果转换回数字。


    function bigSum(a, b){
      let maxLen = Math.max(a.length, b.length);//最大数的位数
      a = a.toString().padStart(maxLen, '0').split('');//转换成相同位数,位数不足就在字符串开头处补0
      b = b.toString().padStart(maxLen, '0').split('');//位数相同后再转成数组
      let result = ''
      let carry = 0;//每次相加后的个位数
      for (let i = maxLen -1; i >= 0; i--) {
        const sum = +a[i] + +b[i] + carry;
        const r = sum % 10;//得到单位数,比如相加结果为14 > 10, 就取个位 4
        carry = sum >= 10 ? 1 : 0;//得到进位,结果 > 10, 往前进1
        result = r + result;// 拼接结果
      }
      if (carry) {
        result = carry + result;//如果加到最后第一位还有进位,拼接到结果前面
      }
      return result;
    },

console.log(this.bigSum('123456', '1234567'))//1,358,023
或者
function addLargeNumbers(num1, num2) {
    let result = '';
    let carry = 0;
    num1 = num1.split('');
    num2 = num2.split('');
    
    while (num1.length || num2.length || carry) {
        carry += (num1.pop() || 0) + (num2.pop() || 0);
        result = (carry % 10) + result;
        carry = Math.floor(carry / 10);
    }
    
    return result;
}
 
console.log(addLargeNumbers('12345678901234567890', '98765432109876543210'));
2. 使用BigInt

BigInt类型,它可以用来安全地表示任意大小的整数。使用BigInt可以避免因超出安全整数范围而导致的精度丢失问题。

function addBigInts(num1, num2) {
    return BigInt(num1) + BigInt(num2);
}
 
console.log(addBigInts('12345678901234567890', '98765432109876543210')); // 使用字符串初始化BigInt
// 或者直接使用数字字面量加上n后缀来创建BigInt
console.log(addBigInts(12345678901234567890n, 98765432109876543210n));

使用BigInt是处理大整数加法的推荐方法,因为它不仅解决了精度问题,还保持了操作的简洁性和性能。注意:BigInt和常规的Number类型不能混合使用,必须都转换为BigInt类型才能进行运算。

总结

  • 对于需要精确表示非常大整数的场景,推荐使用BigInt

  • 如果需要手动处理字符串形式的数字(例如,当数字非常大以至于无法直接使用BigInt时),可以手动实现大数加法算法。但通常来说,直接使用BigInt是最简单且最有效的方法。

你可能感兴趣的:(javascript,前端,开发语言,es6,ecmascript)