gpt4 book ai didi

java - 在 equals() 方法中比较 double 的正确方法

转载 作者:行者123 更新时间:2023-12-01 17:43:27 24 4
gpt4 key购买 nike

我的类中有 double 类型,并且必须重写 equals()/hashCode()。所以我需要比较 double 值。

哪个是正确的方法?

版本 1:

boolean isEqual(double a, double b){
return Double.doubleToLongBits(a) == Double.doubleToLongBits(b);}

版本 2:

boolean isEqual(double a, double b){
final double THRESHOLD = .0001;
return Math.abs(a - b) < THRESHOLD;
}

或者我应该避免原始 double根本不使用它的包装类型 Double ?有了这个我可以使用 Objects.equals(a,b) ,如果ab是双倍的。

最佳答案

在 equals/hashcode 方法中使用的推荐方法[需要引用]是使用 Double.doubleToLongBits()Double.hashcode()分别。

这是因为如果哈希码不同,则 equals 合约要求两个输入的计算结果为“不同”。反之则没有限制。

(注意:事实证明 Double.compare() 内部使用了 doubleToLongBits() 但这不是 API 指定的。因此我不推荐另一方面,hashCode()确实指定它使用doubleToLongBits()。)

实际例子:

@Override
public boolean equals(Object obj) {
if (obj == null || getClass() != obj.getClass())
return false;

Vector2d other = (Vector2d)obj;
return Double.doubleToLongBits(x) == Double.doubleToLongBits(other.x) &&
Double.doubleToLongBits(y) == Double.doubleToLongBits(other.y);
}

@Override
public int hashCode() {
int hash = 0x811C9DC5;
hash ^= Double.hashCode(x);
hash *= 0x01000193;
hash ^= Double.hashCode(y);
hash *= 0x01000193;
return hash;
}

关于java - 在 equals() 方法中比较 double 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58166602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com