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

dew*_*rde 7 java

考虑到:

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

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

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

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

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

Den*_*ret 3

Float.equals如果您确定自己比较 Floats ,则毫无用处,但它还会检查参数的类型并且是自反的。equals例如,不要忘记在集合中自动调用。

这是源代码:

public boolean equals(Object obj) {
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
Run Code Online (Sandbox Code Playgroud)

这允许 的任何实例Float(包括new Float("NaN"))等于其自身,这是equals 通用契约的一部分,并且new Float("-0")与可能有用的实例不同new Float("0")(并且与 一致hashCode)。

至于第二部分:当您处理实际问题时,没有很多情况下您的 epsilon 与某些上下文或物理维度无关(或者您可能不应该使用Floatbut BigDecimal)。从语义上讲,浮点数的相等并没有真正的意义。充其量您对距离感兴趣。