你不知道的 JavaScript 系列中( 8 ) -浮点数
二进制浮点数最大的问题是会出现如下的情况:
0.1+0.3 === 0.3; // false
从数学角度来说,上面的条件判断应该为 true,可结果为什么是 false 呢?
简单来说,二进制浮点数中的 0.1 和 0.2 并不是十分精确,它们想加的结果并非刚好等于 0.3,而是一个比较接近的数字,0.30000000000000004,所以条件判断为 false。
那么应该怎么来判断 0.1+0.2 和 0.3 是否相等呢?最常见的方法是设置一个误差范围值,通常成为 “机器精度”,对 JS 来说,这个值通常是 2^-52。
从 ES6 开始,该值定义在 Number.EPSILON 中,可以直接用,也可以在 ES6 之前对版本写 polyfill
if(!Number.EPSILON) { Number.EPSILON = Math.pow(2,-52); } function numbersCloseEnoughToEqual(n1, n2) { return Math.abs(n1 - n2) < Number.EPSILON } var a = 0.1 + 0.2; var b = 0.3 numbersCloseEnoughToEqual(a, b); // true numbersCloseEnoughToEqual(0.0000001, 0.0000002); // false
能够呈现的最大浮点数大约是 1.798e+308,定义在 Number.MAX_VALUE 中。最小浮点数定义在 Number.MIN_VALUE 中,大约是 5e-324,它不是负数,但无限接近于0