在我们眼中0.1 + 0.2一定是等于0.3的,但是在JavaScript眼中不是!!!
它是这么认为的。。
到底是什么原因造成这个问题呢?其实都是数据的存储方式惹得锅。
因为对计算机输入的所有数据,都要转换为二进制进行处理,0.1和0.2在转为为二进制都是无限循环小数。。。
它们在计算机眼中长这个样子。
0.1:0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001...(1001循环)
0.2:0.1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100...(1100循环)
计算机用于存储浮点数的空间长度是有限的。
蓝色部分:符号位,占1位,0代表正数,1代表负数
绿色部分:指数位,占11位
红色部分:小数位,占52位
也就是说每个小数只有长度为52位的存储空间。0.1和0.2转为二进制后是无限循环数,肯定超过52位。JavaScript对超出部分采用了0舍1入的处理方法。
0.1和0.2相加的计算结果转为十进制是0.300000000000000044408920958
JavaScript只取前16位小数,所以结果是0.30000000000000004
解决办法
其实这个问题可以用toFixed(num)来声明运算结果小数四舍五入的位数,将结果小数进行四舍五入就不会出现这个问题。
还有一个方法,JavaScript提供了一个误差精度Number.EPSILON(2^-52),只需要判断这个数是否小于这个数就可以确定是否相等。
function judge(num1,num2){
return Math.abs(arg1 - arg2) < Number.EPSILON;
}
console.log(judge(0.1 + 0.2, 0.3)); // true