Float.equals(几乎)完全无用,我应该用什么来代替?
考虑到:
它看起来像目前形式的Float.equals几乎完全没用。
我是否错过了某些东西,或者是否有适合使用Float.equals的时间,除非您想要测试二进制相等性的极其罕见的情况除外?
如果是这样的话,真的已经完成了自己的identikit epsilon函数(如第一个链接中推荐的),还是有一个用于这个惊人的常见操作的现有包装?
此外,Double / Float.compare遭受同样的问题,还是有一个现有的比较,需要一个epsilon?
(请注意,我无法将现有的库从Floats更改为BigD)
如果你确定自己比较Float, Float.equals
是无用的,但它也检查参数的类型并且是反射的。 例如,不要忘记在集合中自动调用equals
。
以下是源代码:
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
这允许任何Float
实例(包括new Float("NaN")
等于它自己,这是equals的一般合约的一部分,并且new Float("-0")
与new Float("0")
,这可能是有用的(并与hashCode
一致)。
至于第二部分:当你处理真正的问题时,你的epsilon与某些上下文或物理维度无关(或者你可能不应该使用Float
而是BigDecimal
),并不是很多情况。 在语义上,浮点数的平等并不合理。 最好你对距离感兴趣。
上一篇: Is Float.equals (nearly) completely useless and what should I use instead?
下一篇: How do I delete old remote refs that are no longer valid