2009-09-04 3 views
3

Каков наилучший формат валюты для использования в моей базе данных в сочетании с моим веб-приложением ASP.NET. Я не уверен, лучше ли float или decimal. Обратите внимание: мне не нужны настройки для конкретной культуры.Лучший формат валюты в базе данных

ответ

6

Если вы используете SQL Server, у вас есть тип «деньги», который переводится в десятичный тип в .NET.

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

Here's a nice article explaining decimals and floating point logic in general.

+0

+1: Я думал, что деньги будут очевидным типом ... –

+0

Двоичные числа с плавающей запятой на самом деле имеют большую * большую * точность (за каждый байт), чем десятичные числа с плавающей запятой. (Десятичные числа .NET потребляют * дважды * столько же байтов, сколько плавающие с двойной точностью IEEE-754, но менее чем в два раза точнее). Таким образом, для чего-либо, связанного с нефинансовым числом-хрустом, обычные поплавки на самом деле намного лучше. Но да, для денежных целей вам нужен десятичный тип. –

+0

Daniel: Да, спасибо, я думаю, я мог бы уточнить, что я подразумевал под «потерей точности». –

1

После получения дополнительной информации о обработке кредитных карт, я бы хотел попробовать целые числа (используйте центы вместо долларов). Если вы используете долларовые суммы, я бы использовал десятичные числа.

Большая проблема с валютой и типами данных была округлением ошибок с поплавками, поэтому я бы держался подальше от них.

+0

Использование INTEGERS для представления ничего, но в целом количества приводит к интересным проблемам в будущем. Это справедливо для всего: от ванных комнат в доме (это 2,5 ванны, а не 5 единиц туалета) до долларов (и дробных долларов, т. Е. Цента). В основном, разные потребители данных не понимают/понимают, что данные относятся к дробным количествам. –

1

Я бы пошел с десятичной запятой. Вы хотите сохранить как можно больше точности. Люди, которые закодировали финансовые приложения, знают, о чем я говорю, когда кредит почти равен дебету, но не совсем прав. Именно по этой причине банковские счета с прибылью и убытком.

1

Вы делаете не хотите пойти с FLOAT для представления таких сумм, как деньги. Плохие вещи происходят с округлением, особенно значения агрегируются, добавляются, манипулируются и т. Д.

Если вам нужны дробные доллары (т. Е. Цента), то выбор DECIMAL является подходящим. В противном случае вы можете также придерживаться INTEGERS, чтобы не создавать проблем с грошами

5

Do не использовать float.

десятичный, по спецификации decimal(17, 4), вероятно, допустим. Это означает «17» места слева и до 4 знаков после запятой.

+5

В качестве дополнительного бонуса, имея 17 мест слева, будет учитываться ультра-гипер-мега инфляция, то есть зимбабвийский стиль на стероидах. На второй взгляд, лучше сделайте это 30 слева, на всякий случай, если мы увидим инфляцию * super * -выше-гипер-мега-инсано-wowie. Вы никогда не знаете, когда все будет стоить $ (больше атомов, чем во вселенной) .00! –

+2

Если OP делает форекс, ему понадобится более 4 десятичных знаков. Курсы обмена валюты приходят с большей точностью. –