Проблемы десятичного округления - PullRequest
5 голосов
/ 04 декабря 2008

Учитывая, что Decimal.MaxValue = 79228162514264337593543950335m

Почему следующая строка дает мне 7922816251426433759354395034M в окне Local вместо 7922816251426433759354395033.5m, как и ожидалось?

Десятичная цель = Decimal.MaxValue / 10m;

Ответы [ 2 ]

6 голосов
/ 04 декабря 2008

Я подозреваю, что это на самом деле ошибка компилятора.

Вот короткая, но полная программа, показывающая, почему я так думаю:

using System;

class Test
{
    static void Main()
    {
        decimal constant = decimal.MaxValue / 10m;
        decimal calculated = decimal.MaxValue;
        calculated /= 10m;

        Console.WriteLine (constant);
        Console.WriteLine (calculated);        
    }
}

Выход:

7922816251426433759354395034
7922816251426433759354395033.5

Я покопаюсь в спецификации, чтобы посмотреть, какие гарантии даются.

РЕДАКТИРОВАТЬ: В спецификации, раздел 7.18 утверждает:

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

Это явно не тот случай. Хм.

РЕДАКТИРОВАТЬ: Я отправил ошибку в Microsoft Connect . Посмотрим, что с этим будет.

0 голосов
/ 04 декабря 2008

Я думаю, потому что вы превышаете максимальное значение точности, когда делите на 10. http://en.wikipedia.org/wiki/Arithmetic_precision

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...