考虑到:
看起来Float.equals目前的形式几乎完全没用。
我是否遗漏了某些东西,或者是否有时候使用Float.equals是合适的,除非您想要测试二进制相等的极其罕见的情况?
如果是这样,是否真正完成了自己的identikit epsilon函数(如第一个链接中所推荐的那样),或者是否存在这个令人难以置信的常见操作的现有包装器?
另外,Double / Float.compare是否会遇到同样的问题,或者是否存在需要epsilon的现有比较器?
(请注意,我无法将现有库从Floats更改为BigD)
答案 0 :(得分:3)
Float.equals
是没用的,但它也会检查参数的类型并且是反身的。不要忘记equals
会自动在集合中调用。
这是源代码:
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
这允许Float
的任何实例(包括new Float("NaN")
)与其自身相等,它是the general contract of equals的一部分,new Float("-0")
与{{1}不同这可能很有用(并且与new Float("0")
一致)。
关于第二部分:当你处理真正的问题时,你的epsilon与某些背景或物理维度没有关系(或者你可能不应该这样做),并不是很多情况。使用hashCode
但Float
)。从语义上讲,浮点数的相等性并不合理。您最好对距离感兴趣。