2014-12-06 127 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