比较两个浮点值是否完全相等的一种优雅,易读且不冗长的方法是什么?
听起来很简单,但这是一个严重的问题。 ==
运算符无法完成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
。