Почему 0.1 + 0.2 не равно 0.3, и при чём тут деньги
Заметки

Почему 0.1 + 0.2 не равно 0.3, и при чём тут деньги

Открой калькулятор в браузере или консоль разработчика, набери 0.1 + 0.2 и посмотри на ответ. Там будет не 0.3, а вот это:

0.1 + 0.2
> 0.30000000000000004

Это не баг конкретной программы - так считают почти все компьютеры в мире. И за этим хвостиком ...0004 прячется причина, по которой к деньгам в разработке относятся с особой осторожностью.

Почему так

Мы считаем в десятичной системе, а компьютер - в двоичной, из нулей и единиц. Некоторые простые для нас дроби в двоичной записи бесконечны - ровно как 1/3 в десятичной превращается в 0.3333... без конца. Число 0.1 - как раз такое: целиком в память оно не помещается, и его хранят чуть-чуть неточно, округляя до ближайшего доступного значения. Складываешь два таких неточных числа - и крошечные погрешности вылезают тем самым хвостом.

Аналогия простая: запиши 1/3 как 0.3333 и умножь на три. Получишь 0.9999, а не единицу. Компьютер делает ровно то же самое, только в двоичной системе и с числами вроде 0.1.

При чём тут деньги

По одной операции хвостик незаметен. Но представьте счёт, где складываются тысячи цен, скидок и налогов. Крошечные погрешности накапливаются, и в какой-то момент итог расходится с реальностью на копейку, потом на гривну. Для игры это неважно, а для бухгалтерии, кассы или биллинга это уже "счёт не сходится" - и разбираться, откуда взялась лишняя копейка, больно.

Как правильно

Деньги мы никогда не держим в дробных числах. Внутри системы сумма живёт либо в целых (например, в копейках), либо в специальном точном типе, который не округляет по дороге. А красивое 1 200,00 появляется только в самый последний момент - на экране, при выводе.

Совет

Храни сумму в целых или в точном типе, форматируй только при выводе. Тогда все расчёты остаются точными, и счёт сходится копейка в копейку.

Из таких мелочей и складывается разница между "вроде работает" и "работает правильно".

Александр

Александр

Fullstack-разработчик с 8+ годами опыта - от промышленной автоматизации и работы с оборудованием до электронного документооборота и чат-ботов. Сейчас фокус на прикладном ИИ - от RAG-платформ для диалоговых ботов до компьютерного зрения.