Тип 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
в одном выражении.