3

我正在尝试检查一个值是否等于 + 或 - 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

4 回答 4

22

这在使用双精度时通常需要,因为您可能会得到小的舍入误差。

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 值取决于具体情况。

于 2012-09-12T08:27:21.847 回答
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, ..
}
于 2012-09-12T08:26:41.990 回答
1

当然:

int tolerance = 5; //or any other value you want...
for (int lineNumber : errorLineList) {
    if(lineNumber <= (startLineNumber + tolerance) &&
       lineNumber >= (startLineNumber - tolerance)){
        lineFound = true;
        break;
    }
}
于 2012-09-12T08:29:35.147 回答
0

怎么样

if (lineNumber >= (startLineNumber - 2) && lineNumber <= (startLineNumber + 2))
于 2012-09-12T08:27:50.733 回答