Вебсправочник
Ваш первый сайт

Урок: выбрать допуск для сравнения вычисленных значений

При работе с приближёнными числами часто нужен допуск, а не точное равенство. Урок показывает явную комбинацию абсолютной и относительной погрешности без обещания универсальной формулы для всех задач.

Назначение

При работе с приближёнными числами часто нужен допуск, а не точное равенство. Урок показывает явную комбинацию абсолютной и относительной погрешности без обещания универсальной формулы для всех задач.

Как это работает

Абсолютный допуск помогает около нуля, относительный учитывает масштаб. В учебной функции сначала исключаются нечисловые и бесконечные значения. Выбранные константы иллюстративны и должны заменяться требованиями приложения.

Пример

function closeEnough(a, b, absolute = 1e-9, relative = 1e-9) {
  if (!Number.isFinite(a) || !Number.isFinite(b)) return false;
  return Math.abs(a - b) <= Math.max(absolute, relative * Math.max(Math.abs(a), Math.abs(b)));
}
console.log(closeEnough(0.1 + 0.2, 0.3));
console.log(closeEnough(1000000, 1000000.0001));
console.log(closeEnough(1, 1.1));

Что должно получиться

Для выбранных учебных допусков первые два сравнения проходят, третье — нет. Функция выражает конкретное правило близости, а не исправляет исходную арифметику.

Граница применения и частая ошибка

Такая близость не обязана быть транзитивной и не подходит как универсальное равенство ключей. Ограничьте область допустимых величин, чтобы разность не переполнялась. Для точных счётчиков и денежных сумм сначала выбирают подходящее представление, а не маскируют ошибки допуском.

Самостоятельная проверка

Проверьте числа около нуля, отрицательные значения и NaN. Уменьшите допуски и объясните изменения. Запишите, какой максимальный разброс действительно допустим для вашей измеряемой величины.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.