比较两个浮点值以获得精确相等的优雅,可读和非冗长的方法是什么?
听起来很简单,这是一个邪恶的问题。 ==
运算符无法完成NaN的工作,也对零有特殊处理:
(+0.0 == -0.0) -> true
Double.NaN == Double.NaN -> false
但是我想确定两个值是否完全相同(但我不关心不同的NaN模式,所以任何NaN ==任何其他NaN - > true)。
我可以使用这个丑陋的Monster代码执行此操作:
Double.doubleToLongBits(a) == Double.doubleToLongBits(b)
有没有更好的方法来写这个(并使意图明显)?
答案 0 :(得分:23)
您可以使用
Double.compare(a, b) == 0
来自compareTo的javadoc
答案 1 :(得分:10)
我说,你所拥有的已经是最好的方式了。它清楚地表明您对值的按位表示感兴趣。您碰巧将这些位转换为long
,这是一种方便的64位类型,没有任何时髦的行为。
如果您不希望它频繁出现在您的代码库中,只需添加一个方法来包装它:
public static boolean bitwiseEqualsWithCanonicalNaN(double x, double y) {
return Double.doubleToLongBits(x) == Double.doubleToLongBits(y);
}
请注意,根据您的问题,不区分不同的NaN值。如果您想在以后执行此操作,则需要使用Double.toRawLongBits
。