js中 为什么0.1+0.2不等于0.3 ?

249 阅读1分钟

示例

image.png

原因

在使用浮点数进行计算逻辑处理时,不注意,就可能出现问题
注意,永远不要直接做比较和运算俩个浮点的大小
这个属于数字运算中的精度缺失的问题

在定点数中,如果我们以8位二进制来存储数字。\
对于整数来说,十进制的35会被存储为: 00100011 其代表 2^5 + 2^1 + 2^0。\
对于纯小数来说,十进制的0.375会被存储为: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375\
对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011…由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。\
JS中采用的IEEE 754的双精度标准也是一样的道理在存储空间有限的情况下,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。

解决办法

规避掉这类小数计算时的精度问题,将浮点数(float)转换为整数(int)类型进行计算,整数都是可以精确的计算出结果或者 toFixed 方法可以指定运算结果的小数点后的指定位数,toFixed(1)里面toFixed的参数就时保留的位数。

方法一:将浮点数转化成整数计算

0.1+0.2 => (0.1*10+0.2*10)/10

方法二:js的Number对象有一个保留小数位数的方法:toFixed();传入一个需要保留的位数就好了

parseFloat((0.1+0.2).toFixed(10)) ===0.3