В .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