比较两个浮点值是否完全相等的一种优雅,易读且不冗长的方法是什么?

听起来很简单,但这是一个严重的问题。 ==运算符无法完成NaN的工作,并且还对零进行了特殊处理:

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

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

我可以用这段丑陋的Monster代码来做到这一点:
Double.doubleToLongBits(a) == Double.doubleToLongBits(b)

有没有更好的方法来编写此代码(并使意图显而易见)?

最佳答案

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

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

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

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

07-24 09:49
查看更多