Каков наилучший способ хранения денежной стоимости в базе данных?

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

Ответы

Ответ 1

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

Ответ 2

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

В последнее время я нашел статью о типе данных с десятичной или денежной единицей на сервере Sql, которая может показаться вам интересной:

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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