Skip to main content
 首页 » 编程设计

scala之如何比较 Scala 中的浮点值

2024年12月31日7sky-heaven

据我所知,精确比较对浮点值没有多大意义,因为 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