Похоже, Money
тип не рекомендуется, как описано здесь
Мое приложение должно хранить валюту, какой тип данных я должен использовать? Числовой, денежный или плавающий?
sql
postgresql
database-design
мечтатель
источник
источник
Ответы:
Числовое значение с принудительной точностью до 2 единиц. Никогда не используйте float или float как тип данных для представления валюты, потому что, если вы это сделаете, люди будут недовольны, если итоговая цифра финансового отчета окажется неверной на + или - несколько долларов.
Тип денег просто оставлен по историческим причинам, насколько я могу судить.
источник
scale - precision
numeric(3,2)
сможет хранить макс9.99
3-2 = 1
Ваш источник никоим образом не является официальным. Он датируется 2011 годом, и я даже не узнаю авторов. Если бы тип денег был официально «обескуражен», PostgreSQL сказал бы об этом в руководстве, но это не так .
Чтобы получить более официальный источник , прочтите эту ветку в pgsql-general (только на этой неделе!) , С заявлениями основных разработчиков, включая Д'Арси Дж. М. Кейна (оригинальный автор денежного типа) и Тома Лейна:
Связанный ответ (и комментарии!) Об улучшениях в последних выпусках:
В основном,
money
имеет (очень ограниченное) применение. Postgres Wiki предлагает во многом избежать, за исключением тех узко определенных случаев. Преимущество перед нимnumeric
- производительность .decimal
- это просто псевдоним дляnumeric
Postgres, который широко используется для денежных данных, являясь типом «произвольной точности». Руководство :Лично мне нравится хранить валюту как
integer
представляющую центы, если дробные центы никогда не встречаются (в основном, когда деньги имеют смысл). Это более эффективно, чем любой другой из упомянутых вариантов.источник
money
тип фактически устарел. Проблемы были исправлены, и тип был добавлен обратно в более поздних версиях. Лично мне нравится хранить валюту в видеinteger
центов.Ваш выбор:
bigint
: хранить сумму в центах. Это то, что используют транзакции EFTPOS.decimal(12,2)
: сохранить сумму ровно с двумя десятичными знаками. Это то, что использует большинство программ для главной бухгалтерской книги.float
: ужасная идея - неадекватная точность. Это то, что используют наивные разработчики.Вариант 2 - самый распространенный и самый простой в работе. Сделайте точность (12 в моем примере, что означает всего 12 цифр) настолько большой или маленькой, насколько вам удобнее.
Обратите внимание: если вы объединяете несколько транзакций, которые были результатом расчета (например, с использованием обменного курса), в одно значение, имеющее бизнес-значение, точность должна быть выше, чтобы обеспечить точное значение макроса; рассмотрите возможность использования чего-то подобного,
decimal(18, 8)
чтобы сумма была точной, а отдельные значения можно было округлить с точностью до центов для отображения.источник
numeric(15,4)
илиnumeric(15,6)
это хорошая идея.Я сохраняю все свои денежные поля как:
numeric(15,6)
Кажется чрезмерным иметь такое количество десятичных знаков, но если есть хоть малейшая вероятность, что вам придется иметь дело с несколькими валютами, вам понадобится такая высокая точность для преобразования. Независимо от того, что я представляю пользователю, я всегда храню в долларах США. Таким образом, я могу легко конвертировать в любую другую валюту, учитывая курс конвертации на текущий день.
Если вы никогда не делаете ничего, кроме одной валюты, хуже всего будет то, что вы потратили немного места на хранение нескольких нулей.
источник
Используйте 64-битное целое число, сохраненное как
bigint
Я рекомендую использовать микродоллары (или аналогичную основную валюту). Микро означает 1 миллионную, поэтому 1 микродоллар = 0,000001 доллара.
источник
numeric(15,6)
предлагается в другом ответе?bigint
. Существует developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ... но он поставляется с ограниченной поддержкой (на данный момент) и предостережениями (например, вы не можете легко умножить его на поплавок при конвертации валюты) , Учитывая, что максимум, который вы можете сохранить в целочисленном JS с использованием микродолларов, составляет 9 миллиардов долларов, это, вероятно, все еще хорошо для большинства случаев.Используется
BigInt
для хранения валюты в виде положительного целого числа, представляющего денежное выражение в наименьшей денежной единице (например, 100 центов для хранения 1 доллара США или 100 для хранения 100 иен (японская иена, валюта с нулевым десятичным числом). Это то, что делает Stripe - один самые важные компании финансовых услуг для глобальной электронной коммерции.источник