在实际开发过程中,往往会遇到两个大数相加的情况,相加之后的结果已经超过了JS的整数安全范围[Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]
,n那么最后的计算结果是不正确的。
解决这种问题的方法有很多,如自己手写方法,引入相关库(big.js
,bigNumber.js
)等等,下面是我写的一种解决方法。
代码如下
onAddBigNum(num1, num2) {
// 防止传入整数,因此需转换为字符串
num1 += '';
num2 += '';
console.warn(num1, num2);
// 临时相加之和
let tempSum = 0;
// 最后两数之和
let sum = '';
let arr1 = num1.split('');
let arr2 = num2.split('');
while (arr1.length || arr2.length || tempSum) {
// ~~与Math.floor的作用类似,向下取整
// 但是~~undefined为0,Math.floor(undefined)为NAN
// 因为pop()出来的可能是undefined,故使用~~
tempSum += ~~arr1.pop() + ~~arr2.pop();
sum = (tempSum % 10) + sum;
// 这一步很精髓,一定要理解,当两个数字相加超过10,就将tempSum置为true,
// 后面布尔值相加有疑问的话请看我的js加法原理的文章
tempSum = tempSum > 9;
}
// 为了更好的兼容,这里需要把字符串前面的0替换,
// 当传入的两个分别为'00001568','000064579'会出现最终结果前面为0的情况
return sum.replace(/^0+/, '');
},
console.log(onAddBigNum(9007199254740991, 2)) // 9007199254740993
console.log(onAddBigNum('0009007199254740991', '002')) // 9007199254740993