Тип decimal
- это 128-битный тип данных, подходящий для финансовых и денежных расчетов.
Тип decimal
может представлять значения от 1,0 × 10 -28 до приблизительно 7,9 × 10 28 с 28-29 значащими цифрами.
Конечный набор значений типа decimal
имеет вид (-1) s × c × 10 -e где знак s равен 0 или 1, коэффициент c задается 0 ≤ c < 2 96 а масштаб e таков, что 0 ≤ e ≤ 28.
Тип decimal
не поддерживает подписанные нули, бесконечности или NaN. A decimal
представлен как 96-битное целое число, масштабируемое мощностью десять. Для десятичных знаков с абсолютным значением менее 1,0 м значение является точным для десятичного знака 28 th но не более того.
Для десятичных знаков с абсолютным значением, большим или равным 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
в одном выражении.