bool值在调试模式下构建时与在发布模式下构建不同

本文关键字:构建 模式 布模式 调试 bool | 更新日期: 2024-10-24 09:21:31

我在一个应用程序中遇到了一个相当奇怪的错误,我已经设法将其缩小到这个简单的测试用例中。

protected void Page_Load(object sender, EventArgs e)
{
    bool isHeightExceeded = IsHeightExceeded(10.16f, 127.15f);
    lit.Text = isHeightExceeded.ToString();
}
private bool IsHeightExceeded(float y, float height)
{
    float nextHeight = y + height;
    return (137.31f - nextHeight) < 0;
}

当我在调试模式下构建和运行它时,isHeightExceeded布尔为False(正如我所期望的),但当我在发布模式下重建和运行时,它现在为True。

幕后发生了什么导致了这种情况?我猜这与浮点精度有关,但不完全确定是什么。

如有任何帮助,我们将不胜感激。

bool值在调试模式下构建时与在发布模式下构建不同

我怀疑10.16f+127.15f的值是以64(或80)位计算的,然后与137.31f进行比较……而在发布模式中,该值是计算的,随后截断为32位,然后进行比较。基本上,当中间值没有被固定到较小的精度时,您可以得到这样的结果。

如果这是一个问题,可能建议您不应该从floatdouble开始——如果这些是精确的值,请使用decimal

10.16+127.15正好等于137.31,这意味着(137.31f - nextHeight)的理论值为0。

由于涉及到数值运算,您可能会遇到数值精度问题。使用调试器时可能会与不使用调试器时不同地处理此问题。这只是一个猜测,但我不会感到惊讶。

在任何情况下,您的代码都需要进行更正,以考虑精度错误,并使用自定义的ε公差值(例如,0.00001),以便为人类读者和用户提供可预测的结果。如果你不添加这个公差,代码可能只适用于双值,而不适用于阅读它的人