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

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

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

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

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

可以用这个丑陋的Monster代码做到这一点:

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

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

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

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

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

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

您可以使用

 Double.compare(a, b) == 0 

来自于比较的javadoc

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