检查两个float / double值是否完全相等

时间:2013-03-22 14:22:49

标签: java floating-point

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

听起来很简单,这是一个邪恶的问题。 ==运算符无法完成NaN的工作,也对零有特殊处理:

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

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

可以使用这个丑陋的Monster代码执行此操作:

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

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

2 个答案:

答案 0 :(得分:23)

您可以使用

Double.compare(a, b) == 0

来自compareTo的javadoc

  • 此方法认为Double.NaN等于其自身且大于所有其他double值(包括Double.POSITIVE_INFINITY)。
  • 通过该方法认为
  • 0.0d大于-0.0d。

答案 1 :(得分:10)

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

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

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

请注意,根据您的问题,区分不同的NaN值。如果您想在以后执行此操作,则需要使用Double.toRawLongBits