JS小数相加损失精度

JS 小数相加损失精度

问题:

console.log(0.1+0.2);//0.30000000000000004
console.log(0.1+0.7);//0.7999999999999999

解决思路:

  1. 将小数转化为整数,进行整数相加
  2. 将相加结果重新变为小数

出现原因:
参考 - 小数转化为二进制
有些小数并不能通过二进制完整的表示出来,比如0.1,转化为二进制后就是0.000110011...是一个无限循环小数。并没有一个精确的二进制表示。
这样的小数在参与运算的时候会有一定的舍入操作,得到的结果自然就不是精确的。
其它语言中也有类似的情况出现

实现:

 // 解决问题:小数相加损失精度 解决办法:变成整数之后相加再回退小数位
    function add () {
      let len = arguments.length,
          maxPlace = 0;

      for (let i=0; i<len; i++) {
        let current = arguments[i].toString();
        if (current.indexOf('.') !==-1)  {
          maxPlace = current.split('.')[1].length > maxPlace ? current.split('.')[1].length : maxPlace;
        }
      }

      let power = Math.pow(10, maxPlace);

      let sum = 0;
      for (let i=0; i<len; i++) {
        sum += arguments[i]*power;
      }

      return sum/power;

    }

    console.log('0.1+0.2', 0.1 + 0.2);
    console.log('add', add(0.1 , 0.2));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值