Як зберігати та працювати з грошима в коді та базі даних
Питання вирішено.Використовуватиintкраще і за швидкістю і за розміром даних, які можу в ньому зберігатися. Нижче подробиці.
Давайте спробуємо раз і назавжди обговорити та зрозуміти як зберігати та працювати з грошовими сумами.
Я вивчив питання і зрозумів, що люди розділилися на два табори:
1) Зберігання в int
2) Зберігання у decimal
Припустимо, що мені достатньо вести білінг у рублях з точності до копійок.
Зберігання у bigint
Там видно, що кількість знаків після коми у них може бути різною. А значить для простоти розробки все варто зберігати в мінімальній дробовій грошовій одиниці валюти, здійснюючи конвертацію при виведенні (тобто в int).
Мінуси:
- Потрібно пам'ятати про постійне множення/розподіл на 100
Зберігання в Deciamal/Numeric
Плюси:
- Зберігатися у природному вигляді
- Не треба додатково паритися під час виведення
Мінуси:
- При неакуратній роботі (не через bcmath) можна помилитися при множенні або розподілі
- Робота через bcmath повільніше
- У різної валюти різна кількість знаків поле комою — якщо у вас мультивалютна система, буде надмірність даних. Прийде робити більше 2 знаків після коми, але вони будуть потрібні не всім
- Роберт Мартін: «Використовувати числа з плаваючою точкою для уявлення грошових сум — майже злочин»
Закликаю всіх до обговорення, а я додаватиму пункти. Дуже хочеться покінчити з цим питанням. І в одному та в іншому підході є незручні речі.