Як зберігати та працювати з грошима в коді та базі даних

Питання вирішено.Використовуватиintкраще і за швидкістю і за розміром даних, які можу в ньому зберігатися. Нижче подробиці.

Давайте спробуємо раз і назавжди обговорити та зрозуміти як зберігати та працювати з грошовими сумами.

Я вивчив питання і зрозумів, що люди розділилися на два табори:

1) Зберігання в int

2) Зберігання у decimal

Припустимо, що мені достатньо вести білінг у рублях з точності до копійок.

Зберігання у bigint

Там видно, що кількість знаків після коми у них може бути різною. А значить для простоти розробки все варто зберігати в мінімальній дробовій грошовій одиниці валюти, здійснюючи конвертацію при виведенні (тобто в int).

Мінуси:

  • Потрібно пам'ятати про постійне множення/розподіл на 100

Зберігання в Deciamal/Numeric

Плюси:

  • Зберігатися у природному вигляді
  • Не треба додатково паритися під час виведення

Мінуси:

  • При неакуратній роботі (не через bcmath) можна помилитися при множенні або розподілі
  • Робота через bcmath повільніше
  • У різної валюти різна кількість знаків поле комою — якщо у вас мультивалютна система, буде надмірність даних. Прийде робити більше 2 знаків після коми, але вони будуть потрібні не всім
  • Роберт Мартін: «Використовувати числа з плаваючою точкою для уявлення грошових сум — майже злочин»

Закликаю всіх до обговорення, а я додаватиму пункти. Дуже хочеться покінчити з цим питанням. І в одному та в іншому підході є незручні речі.