2012-09-12 22 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解决方案更短,更清洁。更优雅。我也喜欢这个。感谢您的投票:) –