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

Как decimal ввести реализованный?

Обновление

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

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

18
задан Haywood Jablomey 20 July 2010 в 20:50
поделиться

6 ответов

Decimal Floating Point статья в Википедии с конкретной ссылкой на эту статью о System.Decimal.

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

8
ответ дан 30 November 2019 в 09:32
поделиться

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

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

0
ответ дан 30 November 2019 в 09:32
поделиться

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

Источник

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

Источник

0
ответ дан 30 November 2019 в 09:32
поделиться

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

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

1
ответ дан 30 November 2019 в 09:32
поделиться

Как описано на странице десятичной структуры 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, если применяется соответствующая строка формата.

1
ответ дан 30 November 2019 в 09:32
поделиться

Из "CLR via C #", 3-е издание, Дж. Рихтер:

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

0
ответ дан 30 November 2019 в 09:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: