0.1的二进制表示为0.000110011001100... 1100循环
0.2的二进制表示为0.00110011001100... 1100循环
js存储二进制小数一共有64位,第一位表示正负,0为正,1为负
接下来11为表示指数
最后52位表示小数
所以0.1和0.2最多保留有效数字为52+1=53位
加起来的0.3转换成十进制就是 0.30000000000000004
解决的方法:
设置一个误差范围,成为“机器精度” ,在ES6中提供了Number.EPSILON属性,值为2^(-52),当 0.1 + 0.2 - 0.3< Number.EPSILON时,即可判断 0.1 + 0.2 === 0.3
function numberepsilon(arg1,arg2){
return Math.abs(arg1-arg2) < Number.EPSILON;
}
console.log(numberepsilon(0.1+0.2,0.3))//true