Number.EPSILON

基线 广泛可用

此功能已完善,可在许多设备和浏览器版本中使用。它在浏览器中自以下时间起可用 2015 年 7 月.

Number.EPSILON 静态数据属性表示 1 和大于 1 的最小浮点数之间的差值。

试试

价值

2-52,或约等于 2.2204460492503130808472633361816E-16

Number.EPSILON 的属性属性
可写
可枚举
可配置

描述

Number.EPSILON 是 1 和 Number 格式中可表示的下一个较大数字之间的差值,因为 双精度浮点数格式 只有 52 位来表示 尾数,最低位的值为 2-52

请注意,浮点数的绝对精度会随着数字的变大而降低,因为指数会变大,而尾数的精度保持不变。 Number.MIN_VALUE 是可表示的最小正数,远小于 Number.EPSILON

因为 EPSILONNumber 的静态属性,所以始终将其用作 Number.EPSILON,而不是作为数字值的属性。

例子

测试相等性

任何占用有限位数的数字编码系统,无论您选择何种基数(例如十进制或二进制),都必然无法精确地表示所有数字,因为您试图使用有限的内存量来表示数轴上的无限多个点。例如,十进制系统无法精确地表示 1/3,二进制系统无法精确地表示 0.1。因此,例如,0.1 + 0.2 不完全等于 0.3

js
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

因此,通常建议不要使用 === 比较浮点数。相反,我们可以将两个数字视为相等,如果它们彼此足够接近。如果算术运算在 1 的数量级附近,Number.EPSILON 常数通常是一个合理的误差阈值,因为 EPSILON 本质上指定了数字“1”的准确度。

js
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true

但是,Number.EPSILON 不适合任何对更大数量级进行算术运算的操作。如果您的数据在 103 的数量级上,小数部分的精度将远低于 Number.EPSILON

js
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(x + y); // 2000.3000000000002; error of 10^-13 instead of 10^-16
console.log(equal(x + y, z)); // false

在这种情况下,需要更大的容差。由于比较的数字的数量级约为 2000,因此诸如 2000 * Number.EPSILON 之类的乘数为此示例创建了足够的容差。

js
function equal(x, y, tolerance = Number.EPSILON) {
  return Math.abs(x - y) < tolerance;
}

const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(equal(x + y, z, 2000 * Number.EPSILON)); // true

除了数量级之外,还必须考虑输入的精度。例如,如果数字是从表单输入中收集的,并且输入值只能通过 0.1 步长进行调整(即 <input type="number" step="0.1">),通常有意义的是允许更大的容差,例如 0.01,因为数据只有 0.1 的精度。

注意:重要要点:不要简单地使用 Number.EPSILON 作为相等性测试的阈值。请使用适合您正在比较的数字的数量级和精度的阈值。

规范

规范
ECMAScript 语言规范
# sec-number.epsilon

浏览器兼容性

BCD 表仅在启用了 JavaScript 的浏览器中加载。

另请参阅