超过安全范围的整数相加 JS

  在实际开发过程中,往往会遇到两个大数相加的情况,相加之后的结果已经超过了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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值