2016-07-14 62 views
0

例子:比較雙數組時,如何計算舍入誤差?

(Actual) array: 0.0402666113, 0.2355691 
(Expected) array: 0.04027, 0.23557 

我試圖寫一個JUnit測試,看看我的預期陣列是否實際陣列相匹配。在上面給出的例子中,測試應該通過(即數組相等) - 然而,實際上它們不會。我會收到一條消息,指出'索引0處的數組不同,期望值爲:0.0402666113;實際:0.04027' 。我認爲這是由於數字的精確性。有沒有辦法比較這些數組而不使用for-loop?

我目前正在嘗試使用該行對它們進行比較:

assertArrayEquals(expected, actual); 

我所看到的例子,他們會做這樣的事情:

final double delta = 0.0001; 
assertArrayEquals(expected, actual, delta); 

這應該工作,但是,我得到'無法解析方法assertArrayEquals(double [],double [],double)'。是否有我可以在我的JUnit版本(4.12)中使用的等效方法 - 如果沒有,我如何在IntelliJ中更新我的JUnit?我最近纔開始使用這個IDE。

非常感謝任何幫助,謝謝。

+0

'assertArrayEquals'也會在某處使用循環。 –

+0

你可以使用除以精確度除法運算來進行數學運算,例如Math.round(a/0.0001)== Math.round(b/0.0001) – copeg

+0

爲什麼不寫入自定義數組等於並傳遞'boolean'來聲明? –

回答

0

您可以檢查兩個雙打之間的差異,並確保它們的比較精度高達n位數。比如你要比較0.0402666113和0.04027,你可以寫n的條件= 4,如:

if (Math.abs(expected[i] - actual[i]) < 1.e-4f) { 
    // Validates! 
} 
else{ 
    // Failed validation. 
} 

因此,使用上文我們的數字,他們差的絕對值小於容限下,所以他們被認爲是「平等的」。

+0

的確,這是數值方法教科書的標準答案。您必須指定一些寬容度,並準備好接受其中的差異。 – mohsenmadi

+0

他的問題意味着他明白應該使用delta值來比較浮點數。他正在問如何用JUnit以優雅的方式做到這一點。因此,你的回答完全不能回答他的問題。 – GhostCat