2012-01-17 121 views
3

我的方法之一返回double。當測試這種方法,我jUnit的一部分,我注意到下面的怪胎:雙打和平等

String a = "someString"; 
    String b = "someDifferentString"; 

    double result = c.getScore(a, b, true); 
    System.out.println(result); // prints 0.0 

    assert (result > 0.0); // Test passes 

所以..我問你,0.0怎麼會那麼多0.0≦爲什麼result > 0.0評估爲true

+0

我認爲你可以找到這個主題的答案: http://stackoverflow.com/questions/285680/representing-monetary -values-in-java – Jako 2012-01-17 15:54:21

回答

9

assert是一個Java關鍵字。你需要assertTrue(result > 0.0)

+0

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html根據這個文檔,斷言表達式是有效的,這是由OP完成的權利?我錯過了什麼嗎? – kosa 2012-01-17 15:55:46

+0

非常漂亮!謝謝 – JAM 2012-01-17 15:55:52

+0

好的。我在想這可能是一些浮點精度問題。 +1。 – 2012-01-17 15:58:06

7

比較雙打一般是危險的,因爲根據定義,浮點表示是不精確的。此外,打印數據時必須小心,因爲打印後的圖像通常會與實際存儲的圖像相比較。

這就是說,@ JBNizet釘住了它 - 你正在寫一個Java斷言,而不是JUnit測試!

7

這是浮點數學,這是你的擔心。 0.0可能不是絕對的0.0,但是0.00000000000000009或者真的很小。爲什麼是這樣?好的浮點數學在計算機中是離散的。但實際上浮點數學是連續的,因此我們在離散(數字)和連續(模擬)之間不匹配。錯誤開始蔓延,導致事情漂移一點。如果您想了解更多閱讀:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

有在JUnit方法專門用於比較花車/雙打是允許的公差(即的assertEquals(雙預期,雙實雙小量))設計的。使用這些,你應該穩定你的測試面對你所看到的微小錯誤。請注意不要將它們設置得太高,因爲您的整體錯誤應該很小。

見它還有這樣一個問題:

JUnit assertEquals(double expected, double actual, double epsilon)