2012-07-09 117 views
13

是否有任何Java库进行双重比较? 例如Java双重比较

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

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

NB的,为什么它能够更好地使用第三方JAR的一个很好的例子是IBM提出以下建议:

“如果你不知道的基本测量的规模,使用 测试” ABS (A/b - 1)<小量“很可能是比单纯 比较差更强大的”

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

+0

我不关注。你正在用比较短的代码进行比较。你为什么需要用一种方法来包装它? – Thor84no 2012-07-09 07:48:27

+0

为什么你想要一个双倍比较的图书馆?因为标准语言已经做到了,所以没有任何意义。把你的方法放在JAR中,随时导入并完成。 – m0skit0 2012-07-09 07:49:18

+0

我为许多不同的人编写代码,因知识产权原因无法使用相同的JAR。此外,总是有我的代码错误的机会。 – 2012-07-09 07:54:12

回答

16
+0

警告:番石榴的'fuzzyCompare()'使用天真的“最大绝对差异”方法,这是非常不可靠的,因为它只适用于数值非常有限的范围,因为浮点数固有的舍入和取消。我不会使用它。请参阅[本答案](http://stackoverflow.com/a/28751350/4610114)以获取更多相关问题的详细信息,或者(我的建议)阅读[本文](https://randomascii.wordpress.com/2012/02/25 /比较 - 浮点数 - 2012年版/)对浮动比较这个看起来很简单的问题的复杂性进行了很好的介绍。 – 2015-03-01 06:49:45

2

在标准Java库中没有方法来处理您的问题实际上我建议您遵循Joachim的链接并使用该库,这非常适合您的需求,即使我的建议是创建一个utils库,其中您可以添加经常使用的方法,你在你的问题已经说的一个,作为你的问题的不同实现,你应该考虑寻找到这样的:

Java double comparison epsilon

随意问了其他任何含糊之处

2

你应该放弃任何lib拉里使用天真的“最大绝对差异”方法(如番石榴)。正如Bruce Dawson的优秀文章Comparing Floating Point Numbers, 2012 edition中详细描述的那样,它非常容易出错,因为它只适用于非常有限的数值范围。更为稳健的方法是使用相对差异或ULP进行近似比较。

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