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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

если вы используете 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

в конце,

double= приближение

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

Ответ 3

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

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

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