2015-01-07 65 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)