你不知道的 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