我在一个应用程序中有一个相当奇怪的错误,我设法将其缩小到这个简单的测试用例。
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;
}
当我在 Debug模式下构建和运行它时,isHeightExceeded bool 为 False(如我所料),但是当我在 Release模式下重建和运行时,它现在为 True。
幕后发生了什么导致了这种情况?我猜它与浮点精度有关,但不确定是什么。
如有任何帮助,我们将不胜感激。
最佳答案
我怀疑 10.16f + 127.15f 的值是以 64(或 80)位计算的,然后与 137.31f 进行比较...而在 Release模式下计算值,然后截断为 32 位和 然后比较。基本上,当中间值未被限定为更小的精度时,您可以获得这样的结果。
如果这是一个问题,可能建议您不应该使用 float
或 double
作为开始 - 如果这些是为了要精确值,请改用 decimal
。
关于c# - 在 Debug模式下构建时的 bool 值与在 Release模式下不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11843899/