如何比较Scala中的浮点值?
发布时间:2020-12-16 09:36:31 所属栏目:安全 来源:网络整理
导读:据我所知,精确的比较对浮点值没有什么意义,因为什么是0.0001可以实际上是像0.0001000 … 0001 …要实现我自己的比较函数来指定精度或是有一个常见的做法吗? 我以前用C#(我怀疑,仍然是错误的,因为Double值可能无法代表0.0001,甚至设置为常数(如Michael
据我所知,精确的比较对浮点值没有什么意义,因为什么是0.0001可以实际上是像0.0001000 … 0001 …要实现我自己的比较函数来指定精度或是有一个常见的做法吗?
我以前用C#(我怀疑,仍然是错误的,因为Double值可能无法代表0.0001,甚至设置为常数(如Michael Borgwardt解释here)): public static bool AlmostEquals(this double x,double y,double precision = 0.0001) { if (precision < 0.0) throw new ArgumentException(); return Math.Abs(x - y) <= precision; } 我应该在Scala做同样的事情吗? 解决方法
是的,你可以做同样的事情在Java。您还可以使用一些Scala的酷功能,并使用?=方法创建Double类,该方法只需要指定一次隐式精度参数即可。
scala> case class Precision(val p:Double) defined class Precision scala> class withAlmostEquals(d:Double) { def ~=(d2:Double)(implicit p:Precision) = (d-d2).abs <= p.p } defined class withAlmostEquals scala> implicit def add_~=(d:Double) = new withAlmostEquals(d) add_$tilde$eq: (d: Double)withAlmostEquals scala> 0.0~=0.0 <console>:12: error: could not find implicit value for parameter p: Precision 0.0~=0.0 ^ scala> implicit val precision = Precision(0.001) precision: Precision = Precision(0.001) scala> 0.0 ~= 0.00001 res1: Boolean = true (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |