Java双精度比较

14

是否有适用于进行双精度比较的Java库? 例如:

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

每次我开始一个项目,最终都会重新实现这个功能并复制粘贴代码和测试。
值得注意的是,使用第三方JAR包更好的一个例子是IBM建议如下:
“如果您不知道基础测量的规模,使用测试‘abs(a/b - 1) < epsilon’比仅仅比较差异更加稳健。”
我怀疑很少有人会想到这一点,这说明即使是简单的代码也可能不够优秀。

我不明白。你已经用一行非常短的代码进行了比较。为什么还需要将其包装在一个方法中? - Vala
为什么你想要一个执行双精度比较的库?这没有意义,因为标准语言已经可以做到。把你的方法放进一个 JAR 文件里,在需要的时候导入即可。 - m0skit0
我为许多不同的人编写代码,由于知识产权原因,我不能使用相同的JAR文件。此外,我的代码总是有可能存在漏洞。 - DD.
1
这个问题+答案有你需要的内容:https://dev59.com/yGw15IYBdhLWcg3wFHzf - Nim
在我看来,我不赞成用一个比原始代码更长的函数名来替换代码。 - Peter Lawrey
3个回答

18

1
警告:Guava的fuzzyCompare()使用了天真的“最大绝对差”方法,这是非常不可靠的,因为它只适用于由于浮点数中固有的舍入和取消而仅适用于非常有限的值范围。我不会使用它。请参见此答案以获取更多详细信息,或(我的建议)阅读此文章,以深入了解表面上简单的浮点比较问题的复杂性。 - Franz D.

2
您应该避免使用使用天真的“最大绝对差”方法的任何库(例如Guava)。正如Bruce Dawson在他的优秀文章“比较浮点数,2012年版”中详细说明的那样,这种方法非常容易出错,因为它仅适用于非常有限的值范围。一个更加健壮的方法是使用相对差异或ULP进行近似比较。
我所知道的唯一实现正确的近似比较算法的库是apache.common.math

2
在标准Java库中,实际上没有处理您的问题的方法。我建议您遵循Joachim的链接并使用那个库,它非常适合您的需求。尽管我的建议是创建一个utils库,在其中可以添加您在问题中提到的经常使用的方法。对于您问题的不同实现,您应该考虑查看这个链接:Java double comparison epsilon。如有任何其他疑问,请随时提出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接