В .net, как мне выбрать между десятичным и двойным числом

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

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

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

18
задан Samuel Slade 11 January 2012 в 10:19
поделиться

3 ответа

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

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

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

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

36
ответ дан 30 November 2019 в 06:54
поделиться

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

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

если вы используете 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 = реальная вещь

6
ответ дан 30 November 2019 в 06:54
поделиться

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

1
ответ дан 30 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: