Открой калькулятор в браузере или консоль разработчика, набери 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 появляется только в самый последний момент - на экране, при выводе.
Храни сумму в целых или в точном типе, форматируй только при выводе. Тогда все расчёты остаются точными, и счёт сходится копейка в копейку.
Из таких мелочей и складывается разница между "вроде работает" и "работает правильно".

