Decimal

Тип decimal представляет собой 128-разрядный тип данных, ориентированный на применение в финансовых и денежных вычислениях. Тип decimal представляет значения в диапазоне от 1,0 x 10−28 до 7,9 x 1028 (приблизительно) с 28–29 значащими цифрами.

Тип decimal определяет конечный набор значений вида (–1)s x c x10-e, где параметр s может принимать значения 0 или 1, коэффициент c принадлежит диапазону 0 ЎВ c < 296, а значение степени e принадлежит диапазону 0 ЎВ e ЎВ 28. Тип decimal не поддерживает нули и бесконечности со знаками, а также нечисловые значения. Тип decimal представляется в виде 96-разрядного целого числа, умноженного на определенную степень десяти. Значения типа decimal с абсолютной величиной менее 1.0m имеют точность не более 28 десятичных разрядов. Значения типа decimal с абсолютной величиной не менее 1.0m имеют точность 28 или 29 разрядов. В отличие от типов данных float и double, с помощью типа decimal возможно точное представление десятичных дробей, например 0,1. В представлениях float и double такие числа зачастую представляют собой бесконечные дроби, что увеличивает вероятность возникновения ошибок округления.

Если один из операндов бинарного оператора имеет тип decimal, второй операнд должен иметь целочисленный тип или тип decimal. Перед выполнением операции целочисленный операнд (при его наличии) преобразуется к типу decimal.

В результате выполнения операции получается результат типа decimal. Результат определяется путем вычисления точного результата (с сохранением масштаба, определенного для каждого оператора) и последующего округления в соответствии с разрядностью представления. Результат округляется до ближайшего допустимого значения. Если результат одинаково близок к двум допустимым значениям, округление выполняется до значения, в самом младшем разряде которого содержится четное число (так называемое «банковское округление»). Нулевой результат всегда имеет знак 0 и масштаб 0.

Если в результате выполнения арифметической операции с использованием типа decimal получается значение с абсолютной величиной меньшей или равной 5 ×10-29, операция возвращает нуль. Если в результате выполнения арифметической операции с использованием типа decimal получается значение, превышающее допустимое для типа decimal, порождается исключение System.OverflowException.

Тип decimal обеспечивает более высокую точность, однако обладает меньшим диапазоном по сравнению с типами с плавающей запятой. Таким образом, при преобразовании значений, имеющих тип с плавающей запятой, в значение типа decimal возможно возникновение исключений переполнения. При обратном преобразовании возможно снижение точности результата. В связи с этим не существует неявного преобразования между типами с плавающей запятой и типом decimal. Чтобы использовать операнды с плавающей запятой и операнды типа decimal в одном выражении, необходимо выполнить явное приведение их значений.