背景
以下代码结果为false:
0.1 + 0.2 === 0.3 //false
原因
js中,数字以二进制的方式存储:
符号——长度1——控制正负
指数——长度11——控制小数点位置
尾数——长度52——控制精度
所以,如果尾数超过52位,超出的部分会被省略,导致精度丢失
分析
- 将小数转为二进制
0.1 => 0.000110011001(1001)... // 无限循环
0.2 => 0.00110011(0011)... // 无限循环 - 所以在js中,尾数只能保留52位(有效位53位“1.xxx”),多余的作“四舍五入”
(0.1).toString(2)
'0.0001100110011001100110011001100110011001100110011001101' // 长度57,有效数字长度52
(0.2).toString(2)
'0.001100110011001100110011001100110011001100110011001101' // 长度56,有效数字长度52
解决方案
- 小数转整数处理(先做乘法,再做除法)