2011-08-02 41 views
0

目前,這是我的代碼如下所示:如何避免條件中的double值四捨五入錯誤?

if (!flipped){ 
    scaleX -= 0.1; 
    if (scaleX < 0.0001){ 
     sounds.playSound("flick"); 
     flipped = true; 
    } 
} 

這裏是想什麼我它看起來像:

if (!flipped){ 
    scaleX -= 0.1; 
    if (scaleX == 0){ 
     sounds.playSound("flick"); 
     flipped = true; 
    } 
} 

我怎樣才能做到這一點?由於雙值(將scaleX)從未真正0

回答

2

你要定義某種寬容的,然後做:

if (Math.abs(scaleX) < tolerance) 

你不應該檢查該值是準確零 - 只是「接近零」。這只是二進制浮點類型的一種生活方式......諸如「0.1」和「0.0001」之類的東西在二進制浮點中不能完全表示,這就是爲什麼你遇到這種情況。

目前尚不清楚爲什麼不喜歡你的原代碼,並爲什麼你希望它是第二種形式。除了沒有取得絕對值,第一個代碼對我來說看起來沒問題。 (我會提取出常量,但這是一個單獨的問題。)

+0

感謝喬恩,我只是覺得可能有一個很好的解決方法,因爲那時我只是編碼,然後想回來。而我在這裏。 :)但是,謝謝,我會提取常數並堅持「足夠接近」的方法。 – rtheunissen

1

您不能,因爲浮點數學無法產生精確的結果,因爲只有2^64雙精度值來表示無窮大數字。

1

當使用浮點運算時,通常在概念上寫一個「非常接近」而不是等號。

if (x - y < verySmallValue) 

而不是

if (x == y) 

你y是0,所以你寫

if (x < verySmallValue) 

我認爲這是在概念罰款。