什么是检查Java中2个双精度之间的相等性的好方法

时间:2017-02-01 07:05:22

标签: java

对于Double / Float,从十进制表示转换为二进制表示时,存在一些舍入错误和精度损失。 例如,将float设置为" 6.1"然后重新打印出来,你可能会得到类似" 6.099999904632568359375"的报告值。 哪个是检查2个Double对象的相等性的更好选项: 使用BigDecimal 要么 (Math.abs(double1 - double2)< epsilon)

6 个答案:

答案 0 :(得分:2)

这取决于你的用例。如果您使用货币,请转到BigDecimal。 否则,如果您可以使用近似值,请使用DbContext

答案 1 :(得分:2)

有了番石榴,您可以:

DoubleMath.fuzzyEquals(double a, double b, double tolerance)

DoubleMath.fuzzyCompare(double a, double b, double tolerance)

与编写“ Math.abs(a-b)<= EPSILON”相比,它们更易于使用且更正确。它们涵盖Double.NaN和无穷大的情况。

答案 2 :(得分:0)

如果您想测试相等性,可以使用Double.compare()BigDecimal.

如果您需要大致相等,那么Math.abs(d1-d2) < epsilon

答案 3 :(得分:0)

根据所需的准确程度,它会有所不同。但是可以看看Java.lang.Double.equals()方法。

答案 4 :(得分:0)

如果可以使用库,则可以使用Apache Commons Math,这里有一个Precision类。的工作方式与以前的答案相同。

boolean isEqual = Precision.equals(double x, double y, double eps);

链接到javadoc

答案 5 :(得分:-1)

浮点数具有所谓的epsilon容差,即最小可表示值。要比较浮点数,请检查它们的差异是否在容差范围内。

Math.abs(a-b) <= EPSILON

当然,如果你碰巧使用的数字太大而不适合加倍,你应该使用大数字变体。 EPSILON的容差是几个大于Double.MIN_VALUE的容差,但足够小,方差可以忽略不计。