结论:计算机用二进制存储小数时,就像我们用十进制表示 1/3(0.3333…)一样,有些数无法用二进制精确表示,
只能无限循环,但是呢,计算机的内存是有限的呀,那么必须截断,一截断么就有了极其微小的误差。
我们可以去控制台打印下 0.1 + 0.2,结果是0.30000000000000004,因为二进制的0.1是0.00011001100110011…(无限循环),
0.2是 0.0011001100110011…(无限循环),所以结果就是一个无限接近0.3的数。
打个比方,你有一把尺子,最小刻度是毫米。让你去测量一个长度是 1.333… 毫米的东西,你只能读出它大约是 “1.33毫米” 或 “1.34毫米”。
这个“大约”的读数就是精度误差。计算机的存储空间就像这把尺子的刻度,是有限精度的。
常见的解决方案(具体看场景)
- toFixed: 进行四舍五入
- 转换成整数计算: const result = (0.1 * 10 + 0.2 * 10) / 10;
- decimal.js / big.js: 金额相关的计算还是用这种专门处理数学计算的第三方库,就别整那些花里胡哨的了。
哦对了,我最近开发了一个叫
牛马工作器的chrome拓展插件,很好玩哦,感兴趣的话,给我的公众号回复牛马即可免费获取。
 
                     
                     
                        
                        