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('');//转换成相同位数,位数不足就在字符串开头处补0b = 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, 就取个位 4carry = sum >= 10 ? 1 : 0;//得到进位,结果 > 10, 往前进1result = 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
是最简单且最有效的方法。