Как да съхранявате и работите с пари в код и база данни
Проблемът е разрешен.Използването наintе за предпочитане както по отношение на скоростта, така и по отношение на размера на данните, които могат да се съхраняват в него. По-долу са подробностите.
Нека се опитаме веднъж завинаги да обсъдим и разберем как да съхраняваме и работим с суми пари.
Проучих въпроса и разбрах, че хората са разделени на два лагера:
1) Съхранение в int
2) Съхранение в десетичен знак
Да приемем, че за мен е достатъчно да извършвам фактуриране в рубли с точност до копейки.
Съхранение в bigint
Там можете да видите, че броят на десетичните знаци, които могат да имат, е различен. Така че, за улеснение на разработката, всичко трябва да се съхранява в минималната дробна парична единица на валутата, като се конвертира при извеждане (т.е. в int)
Минуси:
- Трябва да помним за постоянното умножение / деление на 100
Съхранение в Deciamal/Numeric
Плюсове:
- Запазете естественост
- Няма нужда от допълнителна пара при извеждане
Минуси:
- Ако работите небрежно (не чрез bcmath), можете да направите грешка при умножение или деление
- Работата чрез bcmath е по-бавна
- Различните валути имат различен брой десетични знаци — ако имате мултивалутна система, ще има излишък на данни. Ще трябва да направите повече от 2 знака след десетичната запетая, но не всеки ще има нужда от тях
- Робърт Мартин: „Почти е престъпление да се използват числа с плаваща запетая за представяне на пари“
Каня всички на дискусията и ще добавя точки. Наистина искам да сложа край на този въпрос. И в единия, и в другия подход има неудобни неща.