小数toFixed()问题
存储
小数的十进制在转换为二进制时会变成无限循环的二进制,计算机存储不了无限的值那么此时就存在舍弃部分的问题。 舍弃位置为0的话,那么就会导致比原有值小一点。 舍弃位置为1的话,那么就会导致比原有值大一点。
计算
因为小数在存储时可能会多一点点也有可能会少一点点,导致运算的结果可能会是我们正确结果,也有可能偏离正确结果。 例如: 0.3 toFixed之后少一点点
js
0.3.toFixed(20)
'0.29999999999999998890'
0.2 toFixed之后多一点点
js
0.2.toFixed(20)
'0.20000000000000001110'
0.3 + 0.2 刚好等于 0.5,因为两个小数的精度缺失刚好弥补了双方的错误。
0.3 - 0.2 却等于 0.09999999999999998,因为 0.3 本来就缺失了一点点,0.2 却多了一点点,两个相减导致值偏离更大了。
显示
程序在显示时会把二进制转成十进制的小数,然后做近似值处理。导致我们在显示时,看似数值没有问题。
解决方案:
使用第三方专门处理数值的库