js大数相加问题

614 阅读1分钟

什么是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