Float.equals(几乎)是完全没用的,我应该使用什么呢?

时间:2015-05-07 14:31:04

标签: java

考虑到:

看起来Float.equals目前的形式几乎完全没用。

我是否遗漏了某些东西,或者是否有时候使用Float.equals是合适的,除非您想要测试二进制相等的极其罕见的情况?

如果是这样,是否真正完成了自己的identikit epsilon函数(如第一个链接中所推荐的那样),或者是否存在这个令人难以置信的常见操作的现有包装器?

另外,Double / Float.compare是否会遇到同样的问题,或者是否存在需要epsilon的现有比较器?

(请注意,我无法将现有库从Floats更改为BigD)

1 个答案:

答案 0 :(得分:3)

如果您确定自己比较Floats,那么

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与某些背景或物理维度没有关系(或者你可能不应该这样做),并不是很多情况。使用hashCodeFloat)。从语义上讲,浮点数的相等性并不合理。您最好对距离感兴趣