Відкрий калькулятор у браузері чи консоль розробника, набери 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 з'являється лише в найостанніший момент - на екрані, під час виводу.
Зберігай суму в цілих або в точному типі, форматуй тільки під час виводу. Тоді всі розрахунки лишаються точними, і рахунок сходиться копійка в копійку.
Із таких дрібниць і складається різниця між "начебто працює" і "працює правильно".

