2014-12-06 126 views
0

所以...如果它们相等,我必须检查一些值。但他们从来没有,我知道他们应该是,我调试我的应用程序,并得出以下结论简单的算术运算应该是0会返回无穷大

-2.5f - Mathf.Round(1.1f)* 0.6f - (-3.1f)不等于0但它的价值是-1.192093E-07

有没有对此的合理解释,是否有解决方法?我真的需要这种格式的公式。

PS:所有的值都在这里硬编码,但它们是变量,它们也有其他值。问题是什么时候结果应该是0

这是一行代码: Debug.Log(string.Format(“{0}”,-2.5f - Mathf.Round(1.1f)* 0.6f - (-3.1f)));

在OS X 10.9.5上使用Unity 4.5.1f3和Monodevelop 4.0.1。

+0

也在Unity 4.6.0f3中转载。 – 2014-12-06 03:39:07

+3

[浮点数学是否被破坏?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – 2014-12-06 03:48:57

+0

请为这些问题使用unity3d标记。 – 2014-12-06 03:52:48

回答

1

就像在评论中说的-1.192093E-07不是无穷大,它非常接近零。注意“E”后的减号。值为.0000001192093

当您比较浮点数时,不应该使用==,因为浮点运算会导致这种小错误。相反,你可以使用这样的事情:

float diff = aValue - bValue; 
if(diff < 0.000001f && diff > -0.000001f){ 

} 

这可能是阅读“每个程序员都应该知道浮点运算什么”例如here好主意。

+1

甚至epsilon比较不是一个很好的解决办法。有关阅读的好资源是http://realtimecollisiondetection.net/blog/?p=89。 – Bart 2014-12-07 09:03:23