【发布时间】:2020-06-13 17:23:47
【问题描述】:
我在 Unity 中运行此代码(使用 .Net 4.x 的 Mono 后端)
float a = 0.42434249394294f;
float b = 1 - a;
float sum = a + b;
bool compare1 = (a + b) >= 1f;
bool compare2 = sum >= 1f;
在调试中(使用 Visual Studio),compare1 是 false 而compare2 是 true。
这是怎么回事?为什么最后两行不同?我认为sum == a + b。
【问题讨论】:
-
他们是花车。阅读浮点数学的本质。大多数浮点数是它们打算表示的数字的近似值。永远不要检查浮点数或双精度数是否相等。在这里,您正在检查
>= 1f,但实际上,您正在检查== 1f -
我有浮点运算的理论知识。但我原以为最后一行会产生相同的结果。我会澄清这个问题。
-
@dodgy_coder 我找到了this:“浮点中间结果通常在寄存器中使用 80 位精度,但在内存中仅使用 64 位”
-
如果您可以链接到另一个副本,那就太好了。甚至我链接的答案 (stackoverflow.com/a/328644/6879283) 也比当前的副本清晰得多。
标签: c# visual-studio unity3d