Насколько я знаю, точное сравнение не имеет большого смысла для значений с плавающей точкой, поскольку то, что должно быть 0.0001, на самом деле может быть чем-то вроде 0.0001000...0001... Должен ли я реализовать свою собственную функцию сравнения для указания точности или существует общепринятая практика для этого?
Раньше я использовал следующее в C# (что, я подозреваю, все еще неправильно, поскольку значение Double может быть, вероятно, неспособно представлять 0. 0001 вообще, даже заданное как константа (как объяснил Майкл Боргвардт здесь)):
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?
Или с 2,10 ...
case class Precision(p:Double)
implicit class DoubleWithAlmostEquals(val d:Double) extends AnyVal {
def ~=(d2:Double)(implicit p:Precision) = (d - d2).abs < p.p
}