Vb/С# десятичный внутренний формат

Каков внутренний формат "десятичного" значения в VB или С#?

Я не знаю, что это имеет значение для всего, что я делаю немедленно, но это одна из тех вещей, которые хорошо знать. Например, зная, сколько бит и как отрицательные числа хранятся, может означать, что когда вы видите, что отрицательное число появляется там, где вы ожидали положительного, вы можете сразу подумать: "Ах, было переполнение", а не смущение глубокими темными тайнами.

Ответ 1

Ответ на ваш вопрос предоставлен в полном техническом документе документация:

Тип десятичного значения представляет десятичные числа от положительное 79,228,162,514,264,337,593,543,950,335 до отрицательного 79.228.162.514.264.337.593.543.950.335. Тип десятичного значения подходит для финансовых расчетов, требующих большого количества значительные интегральные и дробные цифры и отсутствие ошибок округления. Тип Decimal не устраняет необходимость округления. Скорее, это минимизирует ошибки из-за округления.

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

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

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

И двоичное представление, как описано в документации для GetBits:

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

Возвращаемое значение представляет собой четырехэлементный массив из 32-разрядных целых чисел.

Первый, второй и третий элементы возвращаемого массива содержат низкий, средний и высокий 32 бит 96-битного целочисленного числа.

Четвертый элемент возвращаемого массива содержит масштабный коэффициент и знак. Он состоит из следующих частей:

Биты от 0 до 15, нижнее слово, не используются и должны быть равны нулю.

Биты с 16 по 23 должны содержать показатель между 0 и 28, который указывает мощность 10 для деления целочисленного числа.

Биты с 24 по 30 не используются и должны быть равны нулю.

Бит 31 содержит знак: 0 означает положительный, а 1 означает отрицательный.

Обратите внимание, что представление битов различает отрицательные и положительный ноль. Эти значения считаются равными во всех операции.

Ответ 2

Оба С# и VB.NET decimal относятся к System.Decimal, которые хорошо документированы: System.Decimal

decimal (ссылка С#)

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

Диапазон: ± 1,0 × 10-28 до ± 7,9 × 1028 Точность: 28-29 значащих цифр

Десятичный тип данных (Visual Basic)

Удерживает подписанные 128-битные (16-байтовые) значения, представляющие 96-битные (12-байтовые) целочисленные числа, масштабируемые переменной мощностью 10. Масштабный коэффициент указывает количество цифр справа от десятичной точки; Это находится в диапазоне от 0 до 28. Со шкалой 0 (без десятичных знаков) наибольшее возможное значение составляет +/- 79,228,162,514,264,337,593,543,950,335 (+/- 7.9228162514264337593543950335E + 28). С 28 знаками после запятой наибольшее значение составляет +/- 7.9228162514264337593543950335, а наименьшее отличное от нуля значение равно +/- 0,0000000000000000000000000001 (+/- 1E-28).