c# - 在 Debug模式下构建时的 bool 值与在 Release模式下不同

标签 c# asp.net

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

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 位和 然后比较。基本上,当中间值未被限定为更小的精度时,您可以获得这样的结果。

如果这是一个问题,可能建议您不应该使用 floatdouble 作为开始 - 如果这些是为了要精确值,请改用 decimal

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

相关文章:

c# - Session.Clear()、Session.Abandon()、Session.RemoveAll() 的 MVC 优化?

asp.net - 在 ActionLink 中添加一个 viewbag(代替 actionname)

c# - 如何使用.net core Entity Framework 调用返回list<int>的存储过程

c# - 如何处理大对象?

c# - 如何按名称查找 TimeZoneInfo

asp.net - IIS 应用程序池/重新启动和 ASP.NET

asp.net - 将 Web 服务包装在 try/catch block 中

c# - 是否可以将附加数据从属性传递到错误 View ?

c# - 拒绝访问HRESULT : 0x80070005 (E_ACCESSDENIED)) on SetInputToDefaultAudioDevice();

javascript - 如何控制 ASP.NET Validator Controls 客户端验证