簡體   English   中英

如何使用Epsilon的assertEquals在JUnit中斷言兩個雙精度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM