JavaScript中只有一种数值类型:number,是基于IEEE 754标准的64位双精度浮点型实现(64位二进制)。
JavaScript没有真正意义上的整数,一般来说,没有小数的数值就可以称为整数。
如题,0.1 + 0.2的运算结果,会是什么呢?由于二进制浮点数中0.1和0.2并不是十分精确,所以0.1和0.2的运算结果并不一定会跟预期一样。
实际上0.1 + 0.2的结果是一个非常接近0.3的值:0.30000000000000004
console.log(.1 + .2)
可以看到运算结果是一个非常接近0.3的值,这样的结果,对于不是很大的数值运算是没有什么影响的。
比较
console.log(.1 + .2 === .3)
0.1 + 0.2 和 0.3进行比较的时候,也是由于上述原因,返回的结果是false的。
如何来判断0.1 + 0.2 等于0.3呢?
ES6的Number.EPSILON定义了一个数字常量,作为一个误差范围值,这个值为:2.220446049250313e-16
所以可以直接使用ES6的方法:
function Equal(a, b) {
return Math.abs(a - b) < Number.EPSILON
}
console.log(Equal(.1 + .2, .3)); // true
不支持ES6的浏览器:
if(!Number.EPSILON) {
Number.EPSILON = Math.pow(2, -52)
}
function Equal(a, b) {
return Math.abs(a - b) < Number.EPSILON
}
console.log(Equal(.1 + .2, .3));