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