检查两个浮点/双精度值是否完全相等

2022-09-03 04:44:20

什么是比较两个浮点值以获得精确相等的优雅,可读和非冗长的方法?

尽管听起来很简单,但这是一个邪恶的问题。操作员无法完成NaN的工作,并且对零也有特殊处理:==

(+0.0 == -0.0) -> true
Double.NaN == Double.NaN -> false

但是我想确定两个值是否完全相同(但我关心不同的NaN模式,因此任何NaN ==任何其他NaN ->为真)。

我可以用这个丑陋的怪物代码来做到这一点:

Double.doubleToLongBits(a) == Double.doubleToLongBits(b)

有没有更好的方法来写这个(并使意图显而易见)?


答案 1

您可以使用

Double.compare(a, b) == 0

From the javadoc for compareTo

  • 通过此方法,Double.NaN被视为等于自身并且大于所有其他双精度值(包括Double.POSITIVE_INFINITY)。
  • 此方法认为 0.0d 大于 -0.0d。

答案 2

我会说,你所拥有的已经是最好的方法了。它清楚地表明您对值的按位表示感兴趣。您碰巧将这些位转换为方便的64位类型,没有任何时髦的行为。long

如果您不希望它频繁出现在代码库中,只需添加一个方法来包装它:

public static boolean bitwiseEqualsWithCanonicalNaN(double x, double y) {
    return Double.doubleToLongBits(x) == Double.doubleToLongBits(y);
}

请注意,根据您的问题,这不会区分不同的NaN值。如果你想在以后这样做,你需要使用Double.toRawLongBits