Тип decimal представляет собой 128-битный тип данных, подходящий для финансовых и денежных расчетов.
Тип decimal может представлять значения в диапазоне от 1,0 × 10−28 до приблизительно 7,9 × 1028<. /sup> с 28-29 значащими цифрами.
Конечное множество значений типа decimal имеет вид (–1)s × c × 10-e , где знак s равен 0 или 1, коэффициент c определяется как 0 ≤ c ‹ 2 96, а шкала e такова, что 0 ≤ e ≤ 28.
Тип decimal не поддерживает знаковые нули, бесконечности, или NaN. decimal представляется как 96-битное целое число, масштабированное в степени 10. Для десятичных дробей с абсолютным значением менее 1,0 м значение точно до 28го десятичного знака, но не дальше.
Для десятичных дробей с абсолютным значением, большим или равным 1,0 м, значение является точным до 28 или 29 цифр. В отличие от типов данных float и double, десятичные дробные числа, такие как 0,1, могут быть представлены точно в десятичном представлении. В представлениях float и double такие числа часто являются бесконечными дробями, что делает эти представления более подверженными ошибкам округления.
Если один из операндов бинарного оператора имеет тип decimal, то другой операнд должен быть целочисленного типа или типа decimal. Если присутствует операнд целочисленного типа, он преобразуется в decimal перед выполнением операции.
Результатом операции над значениями типа decimal является результат вычисления точного результата (с сохранением масштаба, определенного для каждого оператора) и последующего округления до соответствия представлению. Результаты округляются до ближайшего представимого значения и, если результат одинаково близок к двум представимым значениям, до значения, которое имеет четное число в младшей значащей позиции (это называется «банковским округлением»). Нулевой результат всегда имеет знак 0 и шкалу 0.
Если десятичная арифметическая операция дает значение, меньшее или равное 5 × 10-29 по абсолютной величине, результат операции становится равным нулю. Если десятичная арифметическая операция дает результат, который слишком велик для формата decimal, выдается System.OverflowException.
Тип decimal имеет большую точность, но меньший диапазон, чем типы с плавающей запятой. Таким образом, преобразования из типов с плавающей запятой в decimal могут привести к возникновению исключений переполнения, а преобразования из decimal в типы с плавающей запятой могут привести к потере точности. По этим причинам не существует неявных преобразований между типами с плавающей запятой и decimal, а без явного приведения невозможно смешивать операнды с плавающей запятой и decimal в одном выражении.