什么是js大数相加问题?
在js代码中,有时需要对数值超过2^53的数进行相加求和,但是最后得出的结果并不正确,这就是所谓的大数相加问题。
大数相加问题是怎么产生的呢?
因为 js的 Number 是IEEE 754标准的64-bits的双精度数值 就是说在 2^53即以内的整数都是精确的,但是超过了这个范围就会导致精度丢失
大数相加问题的解决方法
思路
1.将两个数当做字符串来进行计算
2.比较两个字符串长度,用0在前面补齐长度较短的字符串
3.设置进位,初始值为0
4.从个位开始,两数相加,每次计算都要加上进位
5.当前结果/10计算当前位,然后插入数组最前面
6.将所有数组里的数都放入一个字符串中,去除最终结果中多余的0
7.返回结果
实例如下
function bigSum(str1, str2) {
var a = str1.split('');
var b = str2.split('');
var alen = a.length;
var blen = b.length;
var result = []//结果
var current = 0//记录进位
var sum = 0//记录当前位
var length = Math.max(alen, blen)
while (alen < length) {
a.unshift('0')
alen++;
}
while (blen < length) {
b.unshift('0')
blen++;
}
for (var i = length - 1; i >= 0; i--) {
sum = Number(a[i]) + Number(b[i]) + Number(current)
current = sum >= 10 ? parseInt(sum / 10) : 0
sum = sum >= 10 ? parseInt(sum % 10) : sum
result.unshift(sum)
}
console.log(result)
return result.join('').replace('/^0/', '')
}
console.log(bigSum('100000000000888888', '222222')) //结果为100000000001111110