gpt4 book ai didi

c# - C# 如何评估悬停和立即窗口与编译时的 float ?

转载 作者:太空狗 更新时间:2023-10-29 19:53:28 24 4
gpt4 key购买 nike

我发现在字典中存储 double 有些奇怪,并且对原因感到困惑。

代码如下:

            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");

第二个 if 语句按预期工作; 1.0 不小于 1.0。现在,第一个 if 语句的计算结果为真。非常奇怪的是,当我将鼠标悬停在 if 上时,智能感知告诉我错误,但代码却愉快地移动到 Console.WriteLine。

这是针对 Visual Studio 2008 中的 C# 3.5。

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

欢迎任何见解。

Edit2(稍微重新设计问题):

我可以接受数学精度问题,但我现在的问题是:为什么鼠标悬停可以正确计算?即时窗口也是如此。我将第一个 if 语句中的代码粘贴到即时窗口中,它的计算结果为 false。

更新

首先,非常感谢所有出色的回答。

我在同一台机器上的另一个项目中重新创建它时也遇到了问题。查看项目设置,我看不出有什么不同。查看项目之间的 IL,我看不出有什么不同。查看反汇编,我没有看到明显的差异(除了内存地址)。然而,当我调试原始项目时,我看到: screenshot of problem

即时窗口告诉我 if 为 false,但代码属于条件语句。

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

最佳答案

是 float 精度问题。

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

在 ILDasm/Reflector 中查找它,它会发出类似

的内容
 if (1.0 < 1.0)
Console.WriteLine("Wrong");

关于c# - C# 如何评估悬停和立即窗口与编译时的 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1405486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com