Float.equals(几乎)完全无用,我应该用什么来代替?

考虑到:

  • ==绝对不能用来比较双打/浮动
  • 从文档中可以看出(除了某些类型检查和检查NaN)Double / 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 ),并不是很多情况。 在语义上,浮点数的平等并不合理。 最好你对距离感兴趣。

    链接地址: http://www.djcxy.com/p/26017.html

    上一篇: Is Float.equals (nearly) completely useless and what should I use instead?

    下一篇: How do I delete old remote refs that are no longer valid