14

是否有任何用于进行双重比较的 java 库?例如

public static boolean greaterThanOrEqual(double a, double b, double epsilon){
     return a - b > -epsilon;
}

我开始的每个项目最终都会重新实现这个并复制粘贴代码和测试。

注意为什么最好使用 3rd 方 JAR 的一个很好的例子是 IBM 推荐以下内容:

“如果您不知道基础测量的规模,使用测试“abs(a/b - 1) < epsilon”可能比简单地比较差异更可靠”

我怀疑很多人会想到这一点,并说明即使是简单的代码也可能不是最佳的。

4

3 回答 3

18

番石榴DoubleMath.fuzzyCompare()

于 2012-07-09T07:49:00.127 回答
2

在标准 Java 库中,实际上没有方法可以处理您的问题使用的方法与您在问题中所述的方法一样,对于您的问题的不同实现,您应该考虑对此进行研究:

Java 双重比较 epsilon

随意询问任何其他歧义

于 2012-07-09T08:10:20.723 回答
2

您应该避免使用任何使用天真的“最大绝对差异”方法的库(例如 Guava)。正如 Bruce Dawson 的优秀文章Comparing Floating Point Numbers, 2012 edition中所详述的那样,它非常容易出错,因为它仅适用于非常有限的值范围。一种更稳健的方法是使用相对差异或 ULP 进行近似比较。

我知道的唯一一个确实实现了正确的近似比较算法的库是apache.common.math.

于 2015-03-01T07:04:25.730 回答