js俩个大数之和


js中,对整数范围是有限制的,超过安全范围会发生精度丢失,无法正常计算,常见的解决方案就是转成字符串处理,代码如下:

// 俩个大数相加
    var a = '9998995523412341234123412441123412342',
        b = '0002245332134123423142341423424';
    function bigSum(a, b) {
      a = String(a).split('');
      b = String(b).split('');
      var sum = '', // a,b数组元素之和
          temp = 0, // a,b数组当前位置的计算结果
          length = a.length > b.length ? a.length : b.length;
      while (length + 1) {
        temp = ~~(temp / 10) + ~~a.pop() + ~~b.pop(); // ~~: 双非按位取反运算符,对于正数,向下取整;对于负数,向上取整;非数字取值为0
        sum = (temp % 10) + sum;
        length--;
      }
      return sum.replace(/^0+/, ''); // 去掉字符串前面的0
    }
    bigSum(a, b); // => '9998995525657673368246835583464835766'

思路:1.将俩个字符串数字转成数组,取数组长度大的为循环次数 length + 1,加1是为了计算最后一次进1的情况。

   2. temp 的值为( 当前a、b数组中数字之和 + 上次 temp 值去十取整 ),这里的值相加是数值相加,上次 temp 值若大于10需进1,则取1,小于10则取0。

   3. sum 的值为( 当前 temp 值取余 + 上次 sum 值 ),这里的值相加是字符串拼接,当前仅对 temp 取余,如果需要进1,放到下次循环中处理(即下次计算 temp 值中判断是否进1)。

脚踏实地行,海阔天空飞