等于具有浮点字段的案例类 [英] Equals for case class with floating point fields
问题描述
可以创建带有浮点字段的案例类,例如:
Is it ok, to create case classes with floating point fields, like:
case class SomeClass(a:Double, b:Double)
我猜想自动生成的equal方法在这种情况下不起作用. 覆盖等于最佳解决方案吗?
I guess auto generated equal method won't work in this case. Is overriding equals the best solution?
如果要使用等于的方法,我想避免对epsilon进行硬编码(其中epsilon的定义是=> | this.a-a |< epsilon).这不会编译:
if overriding equals is the way to go, I would like to avoid hardcoding epsilon ( where epsilon is defined like => |this.a-a|< epsilon). This won't compile:
case class SomeClass(a:Double, b:Double, implicit epsilon:Double)
我正在寻找一种通过epsilon而不每次都传递演唱会价值的方法 (一些隐式"魔术).
I am looking for a way to pass epsilon without passing concert value each time (some "implicit" magic).
我还跟进了一个更一般的问题,您将如何为仅具有浮点字段的类定义哈希码?
I have also follow up more general question, how would you define hashcode for class with only floating point fields?
推荐答案
您是正确的.如果您担心精度,则需要覆盖等于:
You are correct. If you are worried about precision, then you will need to override equals:
case class SomeClass(a:Double, b:Double)
SomeClass(2.2 * 3, 1.0) == SomeClass(6.6, 1.0)
// res0: Boolean = false
case class BetterClass(a: Double, b: Double) {
override def equals(obj: Any) = obj match {
case x: BetterClass =>
(this.a - x.a).abs < 0.0001 && (this.b - x.b).abs < 0.0001
case _ => false
}
}
BetterClass(2.2 * 3, 1.0) == BetterClass(6.6, 1.0)
// res1: Boolean = true
这篇关于等于具有浮点字段的案例类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!