[英]How to call assertEquals with Double Epsilon/Precision in Kotlin?
[英]How to Assert Two doubles in JUnit Using assertEquals with Epsilon?
不推薦使用雙精度的assertEquals。 我發現應該使用Epsilon的表格。 這是因為不可能100%嚴格的雙打。 但無論如何我需要比較兩個雙打(預期和實際結果),但我不知道該怎么做。
目前我的測試看起來像:
@Test
public void testCalcPossibleDistancePercentageCount() {
int percentage = 100;
assertEquals("Wrong max possible value for %" + percentage, 110.42, processor.calcPossibleValue(percentage));
percentage = 75;
/*corresponding assertions*/
}
以下是我收到的3個雙值,我想用JUnit檢查:110.42,2760.5和10931.58。 JUnit測試應該如何使用斷言? 我在一個方法中計算得到它們:
processor.calcPossibleValue(allowed_percentage){return /*Some weird formulae here*/;}
您需要在assertEquals
調用中添加第四個參數:兩個雙精度應被視為“相等”的閾值。 你的電話應該是這樣的:
assertEquals("Wrong max possible value for %" + percentage, 110.42,
processor.calcPossibleValue(percentage), 0.01);
上面的調用表明,如果processor.calcPossibleValue(percentage)
返回的值在110.42
±0.01范圍內,那么這兩個值被認為是相等的。 您可以更改此值,使其盡可能小到應用程序所需的值。
有關更多信息,請參閱JUnit文檔 。
Java double使用IEEE 754 64位格式 。 這種格式有52個尾數位。 比較2個值時,epsilon應考慮預期值的大小。
例如,0.01可能適用於110.42但是如果預期值> 2 52則它將不起作用。 2 52的幅度是如此之大,以至於由於精度(即僅52位尾數位)將丟失0.01。 例如,2 52 + 0.01 == 2 52 。
考慮到這一點,epsilon應該縮放到預期值。 例如,預期值÷2 52 - 3或110.42÷2 52 - 3 = 1.96 ...×10 -13。 我選擇了2 52 - 3,因為這將給出尾數中3個最低有效位的容差。
需要注意的是,如果預期值為0.0,則此公式將epsilon計算為0.0,這對於特定情況可能過於嚴格。
另一個警告是不處理NaN和±∞。
Assert.assertTrue("Not equals", expectedDouble - actualDouble == 0);
不需要涉及epsilon或delta。
斷言是不推薦的
assertTrue("message like not equal ",expectedresult-actual == 0);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.