在JUnit中,double的assertEquals接受絕對的delta。但是,不是一個比絕對值更適合保證金的百分比值?當比較兩個較大的值時,由於四捨五入所導致的錯誤(如果有的話)可能會導致最後一個有效數字,而不考慮指數。在這種情況下有一個絕對的三角洲沒有幫助,是嗎?JUnit assertEqual for doubles with percentage delta
這並不困難,我寫了一個,但只是好奇爲什麼JUnit沒有這個功能。我錯過了什麼嗎?
在JUnit中,double的assertEquals接受絕對的delta。但是,不是一個比絕對值更適合保證金的百分比值?當比較兩個較大的值時,由於四捨五入所導致的錯誤(如果有的話)可能會導致最後一個有效數字,而不考慮指數。在這種情況下有一個絕對的三角洲沒有幫助,是嗎?JUnit assertEqual for doubles with percentage delta
這並不困難,我寫了一個,但只是好奇爲什麼JUnit沒有這個功能。我錯過了什麼嗎?
這取決於具體情況。如果你有一個固定的精度,例如你可能想保留兩位小數的0.5E-2的增量,但如果你有一個未知的精度,你想顯著的數字,您可能需要更復雜的東西像
assertEquals(expected, actual, Math.abs(expected)/1e3);
,相對誤差的問題是這是很難知道它是否應該與預期,實際或兩者的組合相關。
人們只能假設JUnit API中沒有線索,但它的目標是浮點數域表達式中的小差異(當小數點後的第15個位置出現差異時)。畢竟,從絕對值版本到的版本比在版本的版本更容易。
對於期望值爲零的情況,百分比容差不會有好處,但是您願意接受一個非常小的值。 cuurent API因此可用於所有數值。
同意。和其他人一樣,可以模擬百分比錯誤。但直接將它作爲API的一部分會更好,這樣用戶的錯誤就會最小化。 – layman
只是一個挑剔的 - 我認爲這是相當合乎邏輯的相對將是預期的。我不能想到一個合理的情況,即人們會根據實際情況指定保證金。 – layman
@LakshmanKakkirala我很習慣實際,所以我自然使用它,如果你希望兩個數字在0.005以內相同,因爲你有兩個精確的小數位,這是一個正常的用例。如果你使用double,你總是需要使用明智的四捨五入,如果你這樣做,相對錯誤就沒有那麼有意義。 –
對於什麼是正確的和不正確的,你的價值不會隨着實際而變化嗎? 我知道這可能沒什麼關係,但從理論上講,兩者並不相同,而且我仍然不確定在哪裏定義測試的成功或失敗,而不是預期的價值,而是取決於實際價值!你能舉個例子,可能嗎? – layman