我有一堂课,有一个float
场地。例如:
public class MultipleFields {
final int count;
final float floatValue;
public MultipleFields(int count, float floatValue) {
this.count = count;
this.floatValue = floatValue;
}
}
我需要能够按值比较实例。现在我该如何正确实施equals
& hashCode
?
通常的实现方式equals
and hashCode
就是只考虑所有领域。例如。 Eclipse 将生成以下内容equals
:
public boolean equals(Object obj) {
// irrelevant type checks removed
....
MultipleFields other = (MultipleFields) obj;
if (count != other.count)
return false;
if (Float.floatToIntBits(floatValue) != Float.floatToIntBits(other.floatValue))
return false;
return true;
}
(以及类似的hashCode
,本质上计算count* 31 + Float.floatToIntBits(floatValue)
).
问题是我的 FP 值会受到舍入误差的影响(它们可能来自用户输入、数据库等)。所以我需要一个“宽容”的比较。
常见的解决方案是使用 epsilon 值进行比较(参见例如比较 IEEE 浮点数和双精度数的相等性 https://stackoverflow.com/questions/21265/comparing-ieee-floats-and-doubles-for-equality)。但是,我不太确定如何实施equals
使用这种方法,仍然有hashCode
这符合equals
.
我的想法是定义用于比较的有效数字位数,然后始终四舍五入到两个数字中的数字位数equals
and hashCode
:
long comparisonFloatValue = Math.round(floatValue* (Math.pow(10, RELEVANT_DIGITS)));
然后如果我替换所有用途floatValue
with comparisonFloatValue
in equals
and hashCode
,我应该得到一个“宽容”的比较,这与hashCode
.
- 这行得通吗?
- 您认为这种方法有什么问题吗?
- 有一个更好的方法吗?看起来好像比较复杂。