十进制舍入问题

5

鉴于 Decimal.MaxValue = 79228162514264337593543950335m

为什么下一行在本地窗口中给出的是7922816251426433759354395034M而不是预期的7922816251426433759354395033.5m?

Decimal target = Decimal.MaxValue / 10m;

2个回答

6
我猜测这是编译器错误。
以下是一个简短但完整的程序,以展示我为什么会这么想:
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提交了一个错误报告。我们将看看会发生什么。

这个断言失败了:Assert.IsTrue(Decimal.MaxValue / 10m == 7922816251426433759354395033.5m); - izokurew
是的,这就是进行常量检查的过程。我认为这里主要是编译器常量算术出了问题。 - Jon Skeet

0

不,精度是相同的,因为我们使用了十进制类型。它应该很容易地注意到除以零,保持尾数不变,只改变指数。完全可以用十进制表示精确结果。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接