3 подписчика
Почему 0.1 + 0.2 !== 0.3 — и при чём тут вообще двоичная система?
Классика:
0.1 + 0.2
// 0.30000000000000004
На первый взгляд кажется, что JavaScript просто решил немного поиздеваться.
Но проблема не в JavaScript как таковом.
Числа типа 0.1 и 0.2 нельзя точно представить в двоичной системе — примерно как 1 / 3 нельзя точно записать конечной десятичной дробью.
Поэтому компьютер хранит ближайшее возможное значение.
И когда эти маленькие погрешности складываются, иногда наружу вылезает хвост:
0.30000000000000004
Поэтому сравнивать дробные вычисления через строгое равенство — не всегда хорошая идея.
Например, обычно проверяют разницу:
Math.abs(a - b) < Number.EPSILON
Главная мысль:
компьютер не “ошибается в математике” — он просто хранит некоторые дроби приблизительно.
И да, иногда этого хватает, чтобы сломать расчёт денег на пару копеек и подарить тебе прекрасный вечер с дебаггером.
Около минуты
4 сентября