2012-09-12 46 views
2

我試圖檢查一個值是否等於+或-2另一個值。用公差檢查值

這就是我所遇到的。

for (int lineNumber : errorLineList) { 
     if (lineNumber == startLineNumber 
       || lineNumber == (startLineNumber + 1) 
       || lineNumber == (startLineNumber + 2) 
       || lineNumber == (startLineNumber - 1) 
       || lineNumber == (startLineNumber - 2)) { 
      lineFound = true; 
      break; 
     } 
    } 

但是,如果我想容忍是5,那麼我必須添加10個檢查。

是否有任何其他優雅的方式來做到這一點在Java中。

回答

15

這是經常需要使用雙打時,因爲你可以得到小的舍入誤差。

if(Math.abs(lineNumber - startLineNumber) <= 2) 

您可以將2改爲5。如果兩個值之間的差小於2。即,它可以是-2,-1,0,1或2。

double對於類似的解決方案是測試「平等」使用

if(Math.abs(a - b) < ERR) // where ERR is 1e-4 or 1e-9 

什麼是良好的使用價值取決於情況。

+0

是真的,用abs()更好,+1 –

+0

這就是我一直在尋找的+1,謝謝。無法理解你的雙重解決方案。 –

+0

@UnniKris - 在雙重示例中,Peter使用[比較](http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm),因爲浮點數字不準確。 – Saul

5

您對價值差異感興趣。你不在乎什麼價值更高,你只是對他們的差異感興趣。我們可以通過lineNumber - startLineNumber獲得。這很好,但它產生積極和消極的價值。所以當我們對這個差異的絕對值我們有他們的距離可以用於比較。

if (Math.abs(lineNumber - startLineNumber) <= 10) { 
    // values are in tolerance -10 .. +10, ... 21 values 
    // the range of tolerance in now simple changeable by one number 
    //   .. the distance of values, which can be defined 
    //   as a constant wherever you want, 
    //   static final field, property file, .. 
} 
+0

這將會給一系列的21個可能的值。 –

+0

感謝您的回答,+1,很好的解釋。 –

0

怎麼樣

if (lineNumber >= (startLineNumber - 2) && lineNumber <= (startLineNumber + 2)) 
1
當然

int tolerance = 5; //or any other value you want... 
for (int lineNumber : errorLineList) { 
    if(lineNumber <= (startLineNumber + tolerance) && 
     lineNumber >= (startLineNumber - tolerance)){ 
     lineFound = true; 
     break; 
    } 
} 
+0

這比我寫的+1好,但我喜歡abs執行更好.. –

+0

是的,abs解決方案更短,更清潔。更優雅。我也喜歡這個。感謝您的投票:) –