EMZETT.
Увійти

Як правильно зберігати грошові суми в програмах

Коротко: Гроші ніколи не зберігають як число з плаваючою комою (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 передавайте суми як рядок або цілі центи, а не як число з десятковими знаками.

Див. також: число з плаваючою комою