Мы обсуждали это на днях на работе, и мне хотелось бы, чтобы не было вопроса о Stackoverflow, на который я бы указал людям, так что вот оно.)
Double
и Decimal
? Double
? десятичное
? Есть много вопросов, которые частично совпадают с этим вопросом, но они, как правило, спрашивают, что кому-то следует делать в данном случае, а не как решить в общем случае.
Я обычно думаю о естественных и искусственных величинах.
Натуральные величины - это вес, рост и время. Они никогда не будут измерены абсолютно точно, и редко можно получить представление об абсолютно точной арифметике: обычно вам не следует складывать высоты, а затем следить за тем, чтобы результат был именно таким, как ожидалось. Используйте double
для такого рода количества. У дублеров огромный диапазон, но ограниченная точность; они также очень быстрые.
Доминирующая искусственная величина - деньги. Есть такое понятие, как «ровно 10,52 доллара», и если вы добавите к нему 48 центов, вы ожидаете получить ровно 11 долларов. Используйте десятичное
для такого рода количества.Обоснование: учитывая, что изначально это искусственно, задействованные числа тоже искусственны, предназначены для удовлетворения человеческих потребностей - что означает, что они естественным образом выражаются в базе 10. Сделайте так, чтобы представление хранилища соответствовало человеческому представлению. decimal
не имеет диапазона double
, но большинству искусственных величин этот дополнительный диапазон также не нужен. Это также медленнее, чем double
, но у меня лично был банковский счет, который давал мне правильный ответ медленно, чем неправильный ответ:)
Для получения дополнительной информации у меня есть статьи на ] Двоичные типы с плавающей запятой .NET и десятичный тип .NET . (Обратите внимание, что decimal
также является типом с плавающей запятой, но рассматриваемая «точка» является десятичной, а не двоичной.)
если вы хотите сохранить реальную точность, оставайтесь с десятичной
если вы хотите сравнить значение, оставайтесь с десятичной
если вы используете double и сделаете это
? ctype(1.0, Double ) / 3
вы получите
0. 333333333333333333333333331
если вы используете decimal и сделаете это
? ctype(1.0, Decimal ) /3
вы получите
0.33333333333333333333333333333333333333333333333333D
и еще один пример, крайний;
decimal dec = new decimal(1, 1, 1, false, 28);
var dou = (double)dec;
получится вот что, double потеряет точность
? dou
0.0000000018446744078004519
? dec
0.0000000018446744078004518913D
в итоге,
double = приближение
decimal = реальная вещь
SQL Server Стоит также упомянуть, что десятичная дробь в SQL Server соответствует десятичной дроби и Nullable Decimal в .net framework. В то время как float в sql server отображается на Double и Nullable Double. На всякий случай, если вы имеете дело с приложением базы данных.
Oracle Я больше не работаю с oracle, как вы можете видеть, он зачеркнут в моей информации профиля :), однако для тех, кто работает с oracle, вот статья MSDN, отображающая типы данных oracle:
http://msdn.microsoft.com/en-us/library/yk72thhd(VS.80 ).aspx