Skip to content

小数toFixed()问题

【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 却多了一点点,两个相减导致值偏离更大了。

显示

程序在显示时会把二进制转成十进制的小数,然后做近似值处理。导致我们在显示时,看似数值没有问题。

解决方案:

使用第三方专门处理数值的库