等于具有浮点字段的案例类 [英] Equals for case class with floating point fields

查看:85
本文介绍了等于具有浮点字段的案例类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可以创建带有浮点字段的案例类,例如:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆