В .net, как выбрать между десятичным и двойным - PullRequest
18 голосов
/ 30 марта 2010

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

  • В чем разница между Double и Decimal?
  • Когда (в каких случаях) следует всегда использовать Double?
  • Когда (в каких случаях) следует всегда использовать Decimal?
  • Каковы движущие факторы, которые следует учитывать в случаях, когда они не попадают в один из двух лагерей выше?

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

Ответы [ 3 ]

36 голосов
/ 30 марта 2010

Я обычно думаю о натуральных против искусственных количествах.

Естественные количества - это такие вещи, как вес, рост и время. Они никогда не будут измерены абсолютно точно, и редко есть какая-либо идея абсолютно точной арифметики: вы не должны, как правило, прибавлять высоты, а затем проверять, что результат в точности соответствует ожидаемому. Используйте double для такого количества. Двойники имеют огромный диапазон, но ограниченную точность; они также очень быстрые.

Доминирующее искусственное количество - деньги. Существует такая вещь, как «ровно 10,52 доллара», и если вы добавите к ней 48 центов, вы ожидаете, что получите ровно 11 долларов. Используйте decimal для такого количества. Обоснование: учитывая, что для начала это искусственно, задействованные числа тоже искусственные, рассчитанные на удовлетворение потребностей человека, что означает, что они естественным образом выражены в базе 10. Сделайте так, чтобы представление хранилища соответствовало представлению человека. У decimal нет диапазона double, но большинству искусственных величин этот дополнительный диапазон тоже не нужен. Это также медленнее, чем double, но у меня лично был банковский счет, который давал бы мне правильный ответ медленнее, чем неправильный ответ:)

Для получения дополнительной информации у меня есть статьи о .NET двоичных типах с плавающей запятой и десятичном типе .NET . (Обратите внимание, что decimal также является типом с плавающей запятой, но рассматриваемая «точка» - это десятичная точка, а не двоичная точка.)

6 голосов
/ 30 марта 2010

, если вы хотите сохранить реальную точность, оставайтесь с десятичным

если вы хотите сравнить значение, оставайтесь с десятичным

если вы используете double и делаете это

? ctype(1.0, Double ) / 3

вы получите

0,33333333333333331

если вы используете десятичное число и делаете это

? ctype(1.0, Decimal ) /3

вы получите

0.3333333333333333333333333333D

и еще один пример, экстремальный;

  decimal dec = new decimal(1, 1, 1, false, 28);
  var dou = (double)dec;

выдаст это, double потеряет некоторую точность

? доу
+0,0000000018446744078004519
? Декабре
0.0000000018446744078004518913D

в конце

двойной = приближение

десятичный = реальная вещь

1 голос
/ 30 марта 2010

SQL Server Стоит также упомянуть, что десятичная дробь в SQL Server сопоставляется с десятичной и нулевой десятичной дробью в .net Framework. В то время как плавающий в сервере sql соответствует Double и Nullable Double. На тот случай, если вы столкнетесь с приложением базы данных.

Oracle Я больше не работаю с oracle, поскольку вы можете видеть, что он зачеркнут в информации моего профиля :), однако для тех, кто работает с oracle, есть статья MSDN, отображающая типы данных oracle:

http://msdn.microsoft.com/en-us/library/yk72thhd(VS.80).aspx

...