2015-01-07 121 views
4
处理双打

我刚开始使用ScalaTest,我现在用的是按照我的规格来比较两个双打如下:在ScalaTest

it should "calculate the price" in { 
    val x = new X(10,10,12,1000) 
    assert(x.price() === 185.92) 
    } 

该规范正在通过,即使我已经把在一个错误的值185.92与价格函数返回的值进行比较(对于上述情况,实际返回值为10.23)。我有其他的规格,我只是比较Ints,他们按预期工作。但涉及Doubles的那些无论通过。除assert之外是否还有其他功能可用于比较Doubles

编辑:

def price() : Double 
+0

而不是实际的问题,但你不应该使用'Double'(或任何浮点型)来表示的价格。改用'BigDecimal'或Spire类型 - 无论如何可以执行精确的十进制算术的类型。 – lmm

+0

是的,我将使用Spire,但我现在只是在尝试ScalaTest。 –

+0

我的第一个理论是,x.price()返回一个类型,认为这个实例等于双185.92。你可以显示什么类型的x.price()返回?此外,如果类型不匹配,则可以混合使用org.scalactic.TypeCheckedEquality或导入org.scalactic.TypeCheckedEquality._以获得类型错误。 –

回答

8

它看起来像你对我已经沿着org.scalactic.TolerantNumerics线,为其文档here得到了Equality[Double]一个隐含的实例范围。

从文档的例子是:

implicit val doubleEquality = TolerantNumerics.tolerantDoubleEquality(0.01) 

但它看起来像有人曾与你的情况下,真正的大公差值实例化它。

您也可以考虑使用+-试图明确公差:

assert(x.price() === 185.92 +- 0.01)