Як правильно зберігати грошові суми в програмах
Коротко: Гроші ніколи не зберігають як число з плаваючою комою (float/double), а як ціле число в найменшій одиниці (центах) або точним десятковим типом.
Докладніше: Двійкові числа з плаваючою комою не можуть точно подати багато десяткових дробів. 0.1 + 0.2 у більшості мов дає 0.30000000000000004. У сумах такі відхилення накопичуються.
Подробиці
- Цілі центи: 19,99 € зберігається як
1999. Додавання й порівняння точні. Ділити на 100 лише для відображення. - Десяткові типи:
DECIMAL(12,2)у SQL,BigDecimal(Java),Decimal(Python, C#). Вони рахують у десятковій системі. - Зберігати валюту: Сума й код валюти (EUR, JPY …) належать одне одному. Не всі валюти мають два знаки після коми (JPY: 0, KWD: 3).
- Округлення: Правило округлення задає бізнес (комерційне, банківське) і застосовується лише наприкінці ланцюжків обчислень. Відсотки й податки дають частки цента.
- Розділення: Під час ділення (100 € на 3) лишається зайвий цент, який треба призначити свідомо.
- Обмін: У JSON передавайте суми як рядок або цілі центи, а не як число з десятковими знаками.
Див. також: число з плаваючою комою