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问题,而且大部分情况下也够用了,如果你需要更精确可以调高。
网友评论