检查带有公差的值

时间:2012-09-12 08:24:26

标签: java

我试图检查一个值是否等于+或 - 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中还有其他优雅的方法吗?

4 个答案:

答案 0 :(得分:20)

使用双打时经常需要这样做,因为你可以得到小的舍入错误。

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

使用ERR的好价值取决于具体情况。

答案 1 :(得分:6)

您对价值差异感兴趣。你不在乎什么价值更高,你只是对他们的差异感兴趣。我们可以通过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, ..
}

答案 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;
    }
}

答案 3 :(得分:0)

怎么样

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