Подтвердить что ты не робот

За кулисами, что происходит с типом десятичного значения в С#/. NET?

Как реализуется тип decimal?

Обновление

  • Это 128-битный тип значения (16 байт)
  • 1 знаковый бит
  • 96 бит (12 байт) для мантиссы
  • 8 бит для экспоненты
  • оставшиеся биты (23 из них!) установлены в 0

Спасибо! Я собираюсь использовать 64-битную длину с моей собственной подразумеваемой шкалой.

4b9b3361

Ответ 1

Десятичная плавающая точка статья в Википедии со специальной ссылкой на эту статью о System.Decimal.

Десятичное число хранится в 128 бит, хотя требуется только 102. Удобно рассматривать десятичное число как три 32-битных целых числа, представляющих мантиссу, а затем одно целое число, представляющее знак и показатель. Верхний бит последнего целого числа является битом знака (обычным способом, когда бит устанавливается (1) для отрицательных чисел), а биты 16-23 (младшие разряды высокого 16-разрядного слова) содержат показатель степени. Остальные биты должны быть четкими (0). Это представление является значением, заданным decimal.GetBits(десятичным), которое возвращает массив из 4 целых чисел.

Ответ 2

Как описано на странице Десятичная структура MSDN в http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspx:

Двоичное представление десятичной Значение состоит из 1-битового знака, 96-битное целочисленное число и масштабирование фактор, используемый для деления 96-битного целое число и указать, какая часть его является десятичной дробью. Масштабирование фактор неявно равен числу 10, повышен до уровня от 0 до 28. Следовательно, двоичный представление десятичного значения формы ((от -296 до 296)/10 (от 0 до 28)), где -296-1 равно MinValue и 296-1 равно MaxValue.

Масштабный коэффициент также сохраняет любые конечные нули в десятичном числе. Конечные нули не влияют на значение десятичного числа в арифметические операции или операции сравнения. Однако конечные нули могут быть обнаруженный методом ToString, если соответствующая строка формата применяется.

Ответ 3

От "CLR via С#" 3rd Edition от J.Richter:

128-битная высокоточная значение с плавающей запятой, обычно используемое для финансовые расчеты, в которых ошибки округления нельзя допускать. из 128 бит, 1 бит представляет знак значения, 96 бит представляют само значение и 8 бит представляют мощность 10 для деления 96-битного значение (может быть от 0 до 28). Остальные биты не используются.

Ответ 4

Ключевое слово decimal обозначает 128-битный тип данных.

Источник

Двоичное представление десятичного значения состоит из 1-битового знака, 96-битного целочисленного числа и коэффициента масштабирования, используемого для разделения 96-битного целого числа и определения того, какая часть его является десятичной дробью. Коэффициент масштабирования неявно равен числу 10, поднятому до экспоненты в диапазоне от 0 до 28. Следовательно, двоичное представление десятичного значения имеет вид ((от -296 до 296)/10 (от 0 до 28)), где -296-1 равно MinValue, а 296-1 равно MaxValue.

Источник

Ответ 5

Из Спецификации языка С#:

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

Ответ 6

Десятичный тип - это еще одна форма числа с плавающей запятой - но в отличие от float и double, база используется 10.

Простое объяснение здесь http://csharpindepth.com/Articles/General/Decimal.aspx