一行代码解决js精度丢失问题

我们在使用 javascript 对Number类型的数据进行加减乘除运算时经常会出现精度丢失问题,比如这样:

 如果我们把计算后的结果保存在一个变量里面,再使用这个变量进行其他操作,可能就会给程序带来一些隐患的bug,那么怎么解决这个问题呢?

比较常见的解决方法是:

1. (0.1 * 10 + 0.2 * 10)/  10    先把小数变整数,然后进行加减法后再变成小数

2.   let a = 0.1 + 0.2   a.toFixed(1)   使用toFixed进行四舍五入(不完全等于数学中的四舍五入)

3.   let a = 10 / 3    Math.round(a)    使用Math.round进行四舍五入,但对小数不太友好

toFixed的四舍五入不等同于数学中的四舍五入,而是遵循银行家算法的四舍五入,且返回值为字符串,Math.round是数学中的四舍五入,但是对两个小数运算时不太友好,比如:

Math.round(0.1 + 0.2)  得到的是0            Math.round(0.3 + 0.2)  得到的是1 

不过可以通过Math.round(num  * 10) / 10 进行解决

之后我在MDN里面找到了 Number.EPSILON 这样一个属性,经过我的使用、测试,发现它搭配Math.round可以很好的解决这个问题

Math.round((num + Number.EPSILON) * 100) / 100      这样使用就可以解决精度丢失问题还保留了两位小数

如果想详细了解js为啥会出现精度丢失的话建议参考:这篇文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值