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

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 bool为False(正如我所期望的),但是当我在发布模式下重建并运行时,它现在为True。

导致这种情况的幕后原因是什么?我猜想这与浮点精度有关,但不能完全确定是什么。

任何帮助,将不胜感激。

最佳答案

我怀疑10.64f + 127.15f的值是在64(或80)位中计算的,然后与137.31f ...进行比较...而在释放模式下,该值将被计算,然后截断为32位,然后进行比较。基本上,当中间值未钳位到较小的精度时,您可以获得类似的结果。

如果是问题,则可能表明您不应该使用floatdouble开头-如果这些是精确值,请改用decimal

关于c# - 在 Debug模式下构建的 bool 值与 Release模式下的 bool 值不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11843899/

10-12 12:45