【发布时间】:2019-09-30 11:03:45
【问题描述】:
我的班级中有双重类型,必须重写 equals()/hashCode()。所以我需要比较双值。
哪种方法正确?
版本 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),如果a 和b 是Double。
【问题讨论】:
-
你想要求双打完全相等还是几乎相等?请记住,“几乎相等”与将双精度值用作哈希码的一部分是不兼容的。
-
@khelwood 我想在类的重写 hashCode()/equals() 方法中使用此方法..
-
@nimo23 如果您有两个几乎相同但不完全相同的双打,您希望它们显示为相等还是不相等?
-
@nimo23 这没有回答 khelwood 的问题。你认为什么是“平等”?浮点值很容易出现微小的错误,即使它们应该是不相等的,也会使它们不相等。
-
您的第一个版本检查值是否完全相同。第二个版本检查它们是否在彼此的
.0001内。哪一个(如果有的话)是合适的取决于你用它做什么。如果使用第二个,则必须在计算哈希码时省略双精度。
标签: java