检查两个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。