Каков наилучший способ хранить денежную стоимость в базе данных? - PullRequest
27 голосов
/ 06 марта 2009

Мне нужно сохранить пару полей, связанных с деньгами, в базе данных, но я не уверен, какой тип данных использовать между money и decimal .

Ответы [ 7 ]

40 голосов
/ 06 марта 2009

Десятичный знак и деньги должны быть довольно надежными. Что я могу заверить вас (из болезненного личного опыта унаследованных приложений), это НЕ использовать float!

14 голосов
/ 06 марта 2009

Я всегда использую десятичную; никогда не использовал ДЕНЬГИ раньше.

Недавно я нашел интересную статью о типе данных десятичный или денежный на сервере Sql:

Деньги против десятичного знака

Также кажется, что тип данных money не всегда дает точные результаты при выполнении вычислений с ним: click

То, что я хорошо делал в прошлом, - это использование поля INT и сохранение суммы в центах (евроцент / долларовый цент).

11 голосов
/ 06 марта 2009

Полагаю, все сводится к точности и масштабу. IIRC, money - 4dp. Если это хорошо, money выражает ваше намерение. Если вы хотите больше контроля, используйте decimal с определенной точностью и масштабом.

4 голосов
/ 06 марта 2009

Это зависит от вашего приложения !!! Я работаю в финансовых службах, где мы обычно считаем, что цена будет существенной до 5 десятичных знаков после запятой, что, конечно, когда вы покупаете пару миллионов за 3.12345 пенсов / цент, это значительная сумма. Некоторые приложения будут предоставлять свой собственный тип SQL для этого.

С другой стороны, это может быть необязательно. Ставки подрядчиков всегда округлялись до ближайших 100 фунтов стерлингов, но в настоящее время, похоже, до ближайших 25 фунтов стерлингов в текущем кредитном кризисе.

2 голосов
/ 17 сентября 2012

Не выравнивайте свои мысли, основываясь на доступных типах данных. Вместо этого проанализируйте ваши требования и посмотрите, какой тип данных подходит лучше всего. Float всегда худший выбор, учитывая ограничение архитектуры при хранении двоичной версии чисел с плавающей запятой. Деньги - это стандартная единица, которая, безусловно, будет иметь больше поддержки для обработки операций, связанных с деньгами. В случае десятичного числа вам придется обрабатывать все без исключения, но вы знаете, что только вы сами обрабатывает десятичный тип, поэтому никаких сюрпризов вы не получите с двумя другими типами данных.

1 голос
/ 01 октября 2013

Для некоторых данных (например, денег), где вы не хотите приближений или изменений из-за значения с плавающей запятой, вы должны быть уверены, что данные никогда не являются «плавающими», они должны быть жесткими с обеих сторон десятичной запятой.
Один из простых способов обеспечить безопасность - это преобразовать его в тип данных INTEGER и убедиться, что при извлечении значения десятичная точка помещается в нужное место.
например,
1. Сохранить $ 240.10 в базу данных.
2. Преобразуйте его в чистую целочисленную форму: 24010 (вы знаете, что это просто смещение десятичной дроби).
3. Верните его обратно в правильное десятичное состояние. Разместите десятичную дробь на 2 позиции справа. $ 240,10

Итак, находясь в базе данных, он будет иметь жесткую целочисленную форму.

1 голос
/ 06 марта 2009

Используйте десятичную запятую и используйте больше десятичных разрядов, чем вы думаете, чтобы расчеты были правильными. Деньги не всегда дают правильные результаты в расчетах. Ни при каких обстоятельствах не используйте float или real, поскольку они являются неточными типами данных и могут привести к неправильным вычислениям (особенно из-за того, что они становятся более сложными).

...