Почему результат Decimal.MaxValue - 0,5 целое число? - PullRequest
5 голосов
/ 17 августа 2010

Я играл сегодня с десятичной дробью.Я заметил это:

Decimal.MaxValue 
79228162514264337593543950335

Decimal.MaxValue - 0.5m
79228162514264337593543950334

Следующий код печатает true.

static void Main(string[] args)
        {
            decimal d = Decimal.MaxValue - 0.5M;
            var b = d % 1 == 0;
            Console.WriteLine(b);

        }

Я уверен, что есть причина, но я не знаю, что это.

Ответы [ 3 ]

11 голосов
/ 17 августа 2010

Десятичный тип использует 96 битов для хранения последовательности цифр ( ref ), плюс знак (1 бит) и коэффициент масштабирования, который определяет местоположение десятичного разряда.

Для этого десятичного числа:

79228162514264337593543950335

Все 96 битов используются слева от десятичной точки - не осталось ничего, чтобы представить дробную часть ответа.Таким образом, оно округляется.

Если вы разделите число на 10:

7922816251426433759354395033.5

Тогда у вас есть несколько битов для представления дробной части - но только до 1/10, нетмельче.

Ключевое различие между decimal и double / float заключается в том, что оно основано на масштабном коэффициенте десятичный , указывающем местоположение десятичной точки ;другие плавающие типы основаны на двоичном масштабном коэффициенте, определяющем местоположение двоичной точки .

1 голос
/ 17 августа 2010

0.5 округляется до вычитания. decimal стремится сделать результат максимально точным, поэтому операция становится 79228162514264337593543950335 - 00000000000000000000000000000.5. Но 0.5 не может быть представлено как decimal требуемой точности и округлено в большую сторону до 1.

0 голосов
/ 17 августа 2010

Это не целое число, оно на самом деле . Decimal.

Целые числа (Int32) могут иметь значения от отрицательного 2 147 483 648 положительных 2 147 483 647.

КакВы можете видеть, что это выходит за пределы этих диапазонов.

С точки зрения отображения и точности, 79228162514264337593543950334.5 не может быть представлен Decimal.

Читать this для получения более подробной информации (Что должен знать каждый компьютерщик об арифметике с плавающей точкой).

...