我正在尝试创建一个自定义匹配器,该匹配器将考虑Double.NaN并将对非nan值使用容差。
AndroidManifest.xml
不幸的是,它不起作用。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果在断言中输入公差,则如果存在NaN,则失败。
import org.scalactic.{Equality, TolerantNumerics}
import org.scalatest.Matchers
trait MoreMatchers extends Matchers {
implicit def doubleEqWithNaNAndTol: Equality[Double] = new Equality[Double] {
implicit val tolerance: Equality[Double] = TolerantNumerics.tolerantDoubleEquality(1e-6)
def areEqual(expected: Double, actual: Any): Boolean = actual match {
case number: Double if number.isNaN => expected.isNaN
case _: Double => actual === expected
case _ => false
}
}
如果我只是像下面这样称呼它,那么它将起作用。
assert(0.00226685508536916 === 0.0022668550853691587) // failure - doesn't use tolerance
assert (Double.NaN === Double.NaN ) // success
然后将其称为:
assert(0.00226685508536916 === 0.0022668550853691587 +- 1e-6) // success
assert (Double.NaN === Double.NaN +- 1e-6) // failure - can't use tolerance when NaN
我想知道是否有可能使用第一种方法使其工作。您以前遇到过这种情况吗?您能提出任何解决方案吗?任何帮助将不胜感激:)
谢谢, ele
答案 0 :(得分:0)
非常感谢eirikr @ d6 :),请参阅custom equality gist中的解决方案
基本上,在上面的代码中,比较非nan双精度数时需要使用all=
,以便能够使用该比较中隐含的公差。
tolerance.areEqual(expected, number)
关于, ele