随笔 - 42,  文章 - 0,  评论 - 12,  阅读 - 51248

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)。

 

脚踏实地行,海阔天空飞

 

posted on   coder__wang  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示