Использовать число с плавающей запятой или десятичное число для учета долларов США? - PullRequest
75 голосов
/ 15 сентября 2008

Мы переписываем нашу устаревшую систему учета в VB.NET и SQL Server. Мы привлекли новую команду программистов .NET / SQL для переписывания. Большая часть системы уже укомплектована суммами в долларах с использованием Float. У старого системного языка, который я запрограммировал, не было Float, поэтому я, вероятно, использовал бы десятичную дробь.

Какая ваша рекомендация?

Следует ли использовать тип данных Float или Decimal для сумм в долларах?

Каковы некоторые плюсы и минусы для любого из них?

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

Еще один кон - все показы, и напечатанные суммы должны иметь оператор формата, который показывает две десятичные позиции. Я заметил несколько раз, где это не было сделано, и суммы не выглядели правильными. (т.е. 10,2 или 10,2546)

Профи - это то, что Float занимает всего 8 байт на диске, тогда как десятичное число будет занимать 9 байтов (десятичное 12,2)

Ответы [ 24 ]

0 голосов
/ 23 октября 2010

Это отличная статья, описывающая , когда использовать float и decimal . Float хранит приблизительное значение, а десятичное - точное.

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

Вот интересный пример, который показывает, что и float, и десятичная дробь способны терять точность. При добавлении числа, которое не является целым числом, а затем вычитании того же числа с плавающей запятой, теряется точность, в то время как десятичная дробь не имеет:

    DECLARE @Float1 float, @Float2 float, @Float3 float, @Float4 float; 
    SET @Float1 = 54; 
    SET @Float2 = 3.1; 
    SET @Float3 = 0 + @Float1 + @Float2; 
    SELECT @Float3 - @Float1 - @Float2 AS "Should be 0";

Should be 0 
---------------------- 
1.13797860024079E-15

При умножении нецелого числа и делении на это же число десятичные дроби теряют точность, а плавающие - нет.

DECLARE @Fixed1 decimal(8,4), @Fixed2 decimal(8,4), @Fixed3 decimal(8,4); 
SET @Fixed1 = 54; 
SET @Fixed2 = 0.03; 
SET @Fixed3 = 1 * @Fixed1 / @Fixed2; 
SELECT @Fixed3 / @Fixed1 * @Fixed2 AS "Should be 1";

Should be 1 
--------------------------------------- 
0.99999999999999900
0 голосов
/ 15 сентября 2008

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

У вас есть типы данных валюты (money, smallmoney), которые следует использовать вместо float или real. Хранение десятичной дроби (12,2) исключит ваши округления, но также устранит их на промежуточных этапах - что на самом деле совсем не то, что вам нужно в финансовом приложении.

0 голосов
/ 15 сентября 2008

Всегда используйте десятичную. Float выдаст вам неточные значения из-за проблем округления.

0 голосов
/ 15 сентября 2008

Числа с плавающей запятой могут только представлять числа, которые являются суммой отрицательных кратных основанию - для двоичной с плавающей запятой, конечно, это два.

Существует только четыре десятичных дроби, представляемых точно в двоичной плавающей запятой: 0, 0,25, 0,5 и 0,75. Все остальное является приближением, точно так же, как 0,3333 ... является приближением для 1/3 в десятичной арифметике.

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

...