C#如何评估悬停在中间窗口和中间窗口上的浮点数与编译后的浮点数?

Ric*_*gan 7 c# math floating-point

我在字典中存储双打时看到了一些奇怪的东西,我对此感到困惑.

这是代码:

            Dictionary<string, double> a = new Dictionary<string, double>();
            a.Add("a", 1e-3);

            if (1.0 < a["a"] * 1e3)
                Console.WriteLine("Wrong");

            if (1.0 < 1e-3 * 1e3)
                Console.WriteLine("Wrong");
Run Code Online (Sandbox Code Playgroud)

第二个if语句按预期工作; 1.0不小于1.0.现在,第一个if语句的计算结果为true.非常奇怪的是,当我将鼠标悬停在if上时,intellisense告诉我错误,但代码很高兴地移动到Console.WriteLine.

这适用于Visual Studio 2008中的C#3.5.

这是浮点精度问题吗?那为什么第二个if语句有效呢?我觉得我在这里缺少一些非常基本的东西.

任何见解都表示赞赏.

Edit2(重新提出问题):

我可以接受数学精度问题,但我现在的问题是:为什么悬停过度评估正确?中间窗口也是如此.我将第一个if语句中的代码粘贴到中间窗口中,并评估为false.

更新

首先,非常感谢所有伟大的答案.

我也在同一台机器上的另一个项目中重新创建这个问题.看看项目设置,我看不出任何差异.看看项目之间的IL,我认为没有差异.看看反汇编,我发现没有明显的差异(除了内存地址).然而,当我调试原始项目时,我看到: 问题的截图http://i30.tinypic.com/ega874.png

即时窗口告诉我if是否为false,但代码属于条件.

无论如何,我认为最好的答案是在这些情况下为浮点运算做准备.我不能放弃这个的原因更多的是调试器的计算与运行时的不同.非常感谢Brian Gideon和stephentyrone的一些非常有见地的评论.

not*_*row 13

这是浮动精度问题.

第二个语句有效,因为编译器在发出.exe之前计算表达式1e-3*1e3.

在ILDasm/Reflector中查找它会发出类似的东西

 if (1.0 < 1.0)
                Console.WriteLine("Wrong");
Run Code Online (Sandbox Code Playgroud)