首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何比较Scala中的浮点值?

如何比较Scala中的浮点值?
EN

Stack Overflow用户
提问于 2011-12-05 20:41:02
回答 2查看 12.3K关注 0票数 26

据我所知,精确比较浮点值没有多大意义,因为0.0001的值实际上可能是0.0001000...0001……我是否应该实现自己的比较函数来指定精度,或者这是一种常见的做法吗?

我过去经常在C#中使用下面的代码(我怀疑这仍然是错误的,因为双精度值可能根本无法表示0.0001,即使设置为常量也是如此(正如Michael Borgwardt对here所解释的那样):

代码语言:javascript
运行
复制
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中做一些类似的事情吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-05 21:07:06

是的,你可以用Java做同样的事情。您还可以使用Scala的一些很酷的特性,并使用一个~=方法来拉皮条Double类,该方法接受一个隐式精度参数,该参数只需要指定一次。

代码语言:javascript
运行
复制
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
票数 30
EN

Stack Overflow用户

发布于 2012-09-16 01:56:40

或者使用2.10...

代码语言:javascript
运行
复制
case class Precision(p:Double)

implicit class DoubleWithAlmostEquals(val d:Double) extends AnyVal {
  def ~=(d2:Double)(implicit p:Precision) = (d - d2).abs < p.p
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8385458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档