javascript关于小数计算的Bug

7*0.8=5.6000000000000005
1.22+2.111=3.3310000000000004

为什么操作小数会出现误差?

一个有趣的测试:
0.1+0.2 == 0.3 //false

浮点数值的最高进度是17位小数,但在进行运算的时候其精确度却远远不如整数;整数在进行运算的时候都会转成10进制; 而Java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。
所以(0.1+0.2)!=03

解决方式:

1.toFixed()

是小数点后指定位数取整,从小数点开始数起。

2.toPrecision()

是处理精度,精度是从左至右第一个不为0的数开始数起。

这两种方法都是存在bug的

3.toPrecision 凑整并 parseFloat 转成数字后再显示

当你拿到 1.4000000000000001 这样的数据要展示时,建议使用 ,如下:
parseFloat(1.4000000000000001.toPrecision(12)) === 1.4 // True
封装成方法就是:
function strip(num, precision = 12) {
return +parseFloat(num.toPrecision(precision));
}
为什么选择 12 做为默认精度?这是一个经验的选择,一般选12就能解决掉大部分0001和0009问题,而且大部分情况下也够用了,如果你需要更精确可以调高。

你可能感兴趣的:(javascript关于小数计算的Bug)