В десятичных орудия типа десятичного с плавающей точкой, тогда как двойного является двоичной плавающей точкой.
Преимущество десятичной системы состоит в том, что она ведет себя как человек в отношении округления, и если вы инициализируете ее десятичным значением, тогда это значение сохраняется точно, как вы указали. Это справедливо только для десятичных чисел конечной длины и внутри представимого диапазона и точности. Если вы инициализировали его с помощью 1.0M/3.0M, тогда он не будет храниться точно так же, как вы бы написали 0,333333, повторяющийся на бумаге.
Если вы инициализируете двоичное значение FP с десятичной запятой, оно будет преобразовано из понятной для человека десятичной формы в двоичное представление, которое редко будет точно таким же значением.
Основная цель типа десятичного для реализации финансовых приложений, в реализации .NET также имеет гораздо более высокую точность, чем дважды, однако бинарная FP непосредственно поддерживается на аппаратном уровне, так значительно быстрее, чем десятичного FP операции.
Обратите внимание, что в два раза с точностью до приблизительно 15 значащих цифр не 15 знаков после запятой.d1 инициализируется значением 7 значащих цифр не 6, а d2 имеет только 1 значащую цифру. Тот факт, что они имеют существенно различную величину, тоже не помогает.
http://msdn.microsoft.com/en-us/library/system.decimal.aspx «Десятичный тип не устраняет необходимость округления. Скорее, он минимизирует ошибки из-за округления. Например, следующее код производит результат 0.999999999999999999999999999999, а не 1. " –
@quant_dev: достаточно хорошо, я отредактировал свой ответ, чтобы отразить это :) –
«System.Decimal использует коэффициент масштабирования, чтобы удерживать позицию десятичной точки, что позволяет точно представлять заданное число с плавающей запятой» - это не соответствует действительности; например, 1/3 не будет отображаться точно ни с помощью двойников (которые используют двоичную базу), ни десятичных знаков (которые используют десятичную базу). Фактически единственной разницей между Double и Decimal является база, количество бит, зарезервированных для показателя и значимости, и может ли экспонента изменять знак (да для Double, no for Decimal). Кроме того, они похожи. System.Decimal не имеет произвольной точности! –