Spec-Zone.ru › JavaScript

Number.EPSILON

Базовая Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Статическое свойство данных Number.EPSILON представляет собой разницу между 1 и наименьшим числом с плавающей запятой, которое больше 1.

Попробуйте

const result = Math.abs(0.2 - 0.3 + 0.1);

console.log(result);
// Expected output: 2.7755575615628914e-17

console.log(result < Number.EPSILON);
// Expected output: true

Значение

2-52, или приблизительно 2.2204460492503130808472633361816E-16.

Атрибуты свойства Number.EPSILON
Изменяемое нет
Перечисляемое нет
Конфигурируемое нет

Описание

Number.EPSILON — это разница между 1 и следующим бо́льшим числом, которое может быть представлено в формате Number, поскольку формат чисел с плавающей запятой двойной точности имеет только 52 бита для представления мантиссы, и самый младший бит имеет значимость 2-52.

Обратите внимание, что абсолютная точность чисел с плавающей запятой уменьшается по мере увеличения числа, поскольку экспонента растет, в то время как точность мантиссы остается прежней. Number.MIN_VALUE — это наименьшее представимое положительное число, которое намного меньше, чем Number.EPSILON.

Поскольку EPSILON является статическим свойством Number, его всегда следует использовать как Number.EPSILON, а не как свойство числового значения.

Примеры

Проверка на равенство

Любая система кодирования чисел, занимающая конечное число битов, независимо от выбранного основания (например, десятичного или двоичного), обязательно не сможет представить все числа точно, потому что вы пытаетесь представить бесконечное количество точек на числовой прямой, используя конечное количество памяти. Например, система с основанием 10 (десятичная) не может точно представить 1/3, а система с основанием 2 (двоичная) не может точно представить 0.1. Таким образом, например, 0.1 + 0.2 не совсем равно 0.3:

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

По этой причине часто советуют, что числа с плавающей запятой никогда не следует сравнивать с ===. Вместо этого мы можем считать два числа равными, если они достаточно близки друг к другу. Константа Number.EPSILON обычно является разумным порогом для ошибок, если арифметические операции находятся в районе порядка 1, потому что EPSILON, по сути, определяет, насколько точным является число "1".

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:

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, создает достаточный допуск для данного случая.

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® 2027
# sec-number.epsilon

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
EPSILON
34
12
25
21
9
34
25
21
9
2.0
37
9
1.0.0
1.0
0.12.0

См. также

  • Полифил Number.EPSILON в core-js
  • Полифил Number.EPSILON от es-shims
  • Number

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API