Как да съхранявате и работите с пари в код и база данни

Проблемът е разрешен.Използването наintе за предпочитане както по отношение на скоростта, така и по отношение на размера на данните, които могат да се съхраняват в него. По-долу са подробностите.

Нека се опитаме веднъж завинаги да обсъдим и разберем как да съхраняваме и работим с суми пари.

Проучих въпроса и разбрах, че хората са разделени на два лагера:

1) Съхранение в int

2) Съхранение в десетичен знак

Да приемем, че за мен е достатъчно да извършвам фактуриране в рубли с точност до копейки.

Съхранение в bigint

Там можете да видите, че броят на десетичните знаци, които могат да имат, е различен. Така че, за улеснение на разработката, всичко трябва да се съхранява в минималната дробна парична единица на валутата, като се конвертира при извеждане (т.е. в int)

Минуси:

  • Трябва да помним за постоянното умножение / деление на 100

Съхранение в Deciamal/Numeric

Плюсове:

  • Запазете естественост
  • Няма нужда от допълнителна пара при извеждане

Минуси:

  • Ако работите небрежно (не чрез bcmath), можете да направите грешка при умножение или деление
  • Работата чрез bcmath е по-бавна
  • Различните валути имат различен брой десетични знаци — ако имате мултивалутна система, ще има излишък на данни. Ще трябва да направите повече от 2 знака след десетичната запетая, но не всеки ще има нужда от тях
  • Робърт Мартин: „Почти е престъпление да се използват числа с плаваща запетая за представяне на пари“

Каня всички на дискусията и ще добавя точки. Наистина искам да сложа край на този въпрос. И в единия, и в другия подход има неудобни неща.