Как decimal
ввести реализованный?
Обновление
Спасибо! Я собираюсь придерживаться использования 64-разрядного долго с моим собственным подразумеваемым масштабом.
Decimal Floating Point статья в Википедии с конкретной ссылкой на эту статью о System.Decimal
.
Десятичная дробь хранится в 128 битах, хотя строго необходимо только 102. Удобно рассматривать десятичную дробь как три 32-битных целых числа, представляющих мантиссу, а затем одно целое число, представляющее знак и экспоненту. Старший бит последнего целого числа является битом знака (в обычном случае этот бит устанавливается (1) для отрицательных чисел), а биты 16-23 (младшие биты старшего 16-битного слова) содержат экспоненту. Все остальные биты должны быть чистыми (0). Такое представление дает функция decimal.GetBits(decimal), которая возвращает массив из 4 битов.
Десятичный тип - это еще одна форма числа с плавающей запятой - но в отличие от float и double, используется основание 10.
Простое объяснение здесь http://csharpindepth.com/Articles/General/Decimal.aspx
Ключевое слово decimal обозначает 128-битный тип данных.
Двоичное представление десятичного значения состоит из 1-битного знака, 96-битного целого числа и масштабного коэффициента, используемого для деления 96-битного целого числа и указания того, какая его часть является десятичной дробью. Масштабирующий коэффициент неявно представляет собой число 10, возведенное в степень экспоненты в диапазоне от 0 до 28. Поэтому двоичное представление десятичного значения имеет вид ((-296 - 296) / 10(0 - 28)), где -296-1 равно MinValue, а 296-1 равно MaxValue.
Тип
decimal
- это 128-битный тип данных, подходящий для финансовых и денежных вычислений.
Типdecimal
может представлять значения от 1,0 × 10-28 до приблизительно 7,9 × 1028 с 28-29 значащими цифрами.Конечное множество значений типа
decimal
имеет вид (-1)s × c × 10-e, где знак s равен 0 или 1, коэффициент c задан 0 ≤ c < 296, а масштаб e таков, что 0 ≤ e ≤ 28.
Типdecimal
не поддерживает знаковые нули, бесконечности или NaN.decimal
представляется как 96-битное целое число, масштабированное по степени десяти. Для десятичных дробей с абсолютным значением менее 1.0m, значение точно до 28-го десятичного знака, но не далее.Для десятичных дробей с абсолютным значением больше или равным 1,0 м значение точно до 28 или 29 знака. В отличие от типов данных
float
иdouble
, десятичные дробные числа, такие как 0,1, могут быть представлены точно в десятичном представлении. В представленияхfloat
иdouble
такие числа часто являются бесконечными дробями, что делает эти представления более подверженными ошибкам округления.Если один из операндов двоичного оператора имеет тип
decimal
, то другой операнд должен быть интегрального типа или типаdecimal
. Если присутствует операнд интегрального типа, то перед выполнением операции он преобразуется вдесятичный
.Результат операции над значениями типа
decimal
- это результат вычисления точного результата (с сохранением масштаба, как определено для каждого оператора) и последующего округления для соответствия представлению. Результаты округляются до ближайшего представимого значения, а если результат одинаково близок к двум представимым значениям, то до того значения, которое имеет четное число в позиции наименьшего значащего разряда (это известно как "округление банкира"). Нулевой результат всегда имеет знак 0 и масштаб 0.Если десятичная арифметическая операция дает значение меньше или равное 5 × 10-29 по абсолютной величине, то результат операции становится нулевым. Если десятичная арифметическая операция дает результат, который слишком велик для
десятичного
формата, возникаетSystem.OverflowException
.Тип
decimal
имеет большую точность, но меньший диапазон, чем типы с плавающей точкой. Поэтому преобразования из типов с плавающей точкой вdecimal
могут привести к исключениям переполнения, а преобразования изdecimal
в типы с плавающей точкой могут привести к потере точности. По этим причинам не существует неявных преобразований между типами с плавающей точкой иdecimal
, и без явного приведения невозможно смешивать операнды с плавающей точкой иdecimal
в одном выражении.
Как описано на странице десятичной структуры MSDN по адресу http://msdn.microsoft.com/en-us/library/system.decimal (VS.80) .aspx :
Двоичное представление Decimal значение состоит из 1-битного знака, 96-битное целое число и масштабирование коэффициент, используемый для деления 96-битного целое число и укажите, какая его часть является десятичной дробью. Масштабирование фактор - это неявно число 10, возведен в степень от 0 до 28. Следовательно, двоичная представление десятичного значения формы, ((от -296 до 296) / 10 (от 0 до 28)), где -296-1 равно MinValue, а 296-1 равно MaxValue.
Коэффициент масштабирования также сохраняет любые завершающие нули в десятичном числе. Завершающие нули не влияют на значение десятичного числа в арифметические операции или операции сравнения. Однако конечные нули могут быть обнаруживается методом ToString, если применяется соответствующая строка формата.
Из "CLR via C #", 3-е издание, Дж. Рихтер:
128-битный высокоточный значение с плавающей запятой, обычно используемое для финансовые расчеты, в которых ошибки округления недопустимы. Из 128 бит, 1 бит представляет знак значения, 96 бит представляют само значение, а 8 бит представляют степень 10 для деления 96-битного значение по (может быть любым от 0 до 28). Остальные биты не используются.