十进制舍入问题

时间:2008-12-04 20:00:31

标签: c# types

鉴于Decimal.MaxValue = 79228162514264337593543950335m

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

十进制目标= Decimal.MaxValue / 10m;

2 个答案:

答案 0 :(得分: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节声明:

  

编译时的评估   常量表达式使用相同的   作为运行时评估的规则   非常数表达式,除了   运行时评估会有的地方   引发异常,编译时   评估会导致编译时错误   发生。

这显然不是这里的情况。 HMM。

编辑:我已提交a bug to Microsoft Connect。我们会看到它会发生什么。

答案 1 :(得分:0)

我猜是因为当你除以10时,你超越了最大精度值。http://en.wikipedia.org/wiki/Arithmetic_precision

相关问题