加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何比较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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读