Найти в Дзене
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

Главная мысль:
компьютер не “ошибается в математике” — он просто хранит некоторые дроби приблизительно.
И да, иногда этого хватает, чтобы сломать расчёт денег на пару копеек и подарить тебе прекрасный вечер с дебаггером.
Почему 0.1 + 0.2 !== 0.3 — и при чём тут вообще двоичная система?  Классика:  0.1 + 0.2 // 0.30000000000000004  На первый взгляд кажется, что JavaScript просто решил немного поиздеваться.
Около минуты