Ответ 1
Десятичная сумма и деньги должны быть достаточно надежными. Я могу заверить вас (от мучительного личного опыта от унаследованных приложений) НЕ использовать float!
Мне нужно сохранить пару связанных с деньгами полей в базе данных, но я не уверен, какой тип данных использовать между деньгами и десятичной.
Десятичная сумма и деньги должны быть достаточно надежными. Я могу заверить вас (от мучительного личного опыта от унаследованных приложений) НЕ использовать float!
Я всегда использую Decimal; никогда не использовал ДЕНЬГИ раньше.
В последнее время я нашел статью о типе данных с десятичной или денежной единицей на сервере Sql, которая может показаться вам интересной:
Также кажется, что тип данных денег не всегда приводит к точным результатам при выполнении расчетов с ним: click
То, что я делал в прошлом, использует поле INT и сохраняет сумму в центах (евроцен/доллар).
Я думаю, это сводится к точности и масштабам. IIRC, money
- 4dp. Если это нормально, money
выражает ваши намерения. Если вы хотите большего контроля, используйте decimal
с определенной точностью и масштабированием.
Это зависит от вашего приложения!!! Я работаю в финансовых услугах, где мы обычно считаем, что цена будет значимой до 5 знаков после запятой после пункта, что, конечно, когда вы покупаете пару миллионов в 3.12345 пенсов/центов, это значительная сумма. Некоторые приложения будут поставлять свой собственный тип sql, чтобы справиться с этим.
С другой стороны, это может быть необязательно. < & Юмор GT; Ставки подрядчиков всегда были округлены до ближайших 100 фунтов стерлингов, но в настоящее время они, похоже, до ближайшего 25 фунтов стерлингов в текущем кредитном кризисе. </& Юмор GT;
Не выравнивайте свои мысли на основе доступных типов данных. Скорее, проанализируйте свое требование, а затем посмотрите, какой тип данных подходит лучше всего. Float - это самый худший выбор, учитывая ограничение архитектуры при хранении двоичной версии чисел с плавающей запятой. Деньги являются стандартным подразделением и, несомненно, будут иметь больше поддержки для обработки операций, связанных с деньгами. В случае десятичного кода вам придется обрабатывать все и все, но вы знаете только тех, кто обрабатывает десятичный тип, поэтому никаких сюрпризов, которые вы можете получить с двумя другими типами данных.
Используйте десятичные числа и используйте больше десятичных знаков, чем вы считаете нужным, чтобы качелирование было правильным. Деньги не позволяют возвращать правильные результаты в вычислениях. Ни при каких обстоятельствах не используйте float или real, поскольку это неточные типы данных и могут привести к ошибкам вычислений (особенно по мере их усложнения).
Для некоторых данных (например, денег), где вы не хотите приближения или изменений из-за значения float, вы должны быть уверены, что данные никогда не "плавают", они должны быть жесткими с обеих сторон десятичной точки.
Один простой способ быть в безопасности - это значение, преобразуя его в тип данных INTEGER, и убедитесь, что при извлечении значения десятичная точка помещается в нужное место.
например,
1. Сэкономить $240.10 в базе данных.
2. Преобразуйте его в чистую интегральную форму: 24010 (вы знаете, что это просто сдвиг десятичной).
3. Верните его обратно в правильное десятичное состояние. Поместите десятичное число в 2 позиции справа. $240,10
Итак, находясь в databse, он будет в жесткой целочисленной форме.