2016-07-14 9 views
0

Beispiel:Wie kann ich beim Vergleich von Doppelfeldern den Rundungsfehler berücksichtigen?

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

Ich versuche, einen JUnit-Test zu schreiben, die tatsächliche Anordnung, um zu sehen, ob meine erwartete Array übereinstimmt. In dem oben angegebenen Beispiel sollte der Test bestehen (d. H. Arrays sind gleich) - in der Praxis jedoch nicht. Ich würde eine Nachricht in der Form von Arrays bekommen, die sich bei Index 0 unterscheiden, erwartet: 0.0402666113; aktuell: 0,04027 '. Ich nehme an, dies liegt an der Genauigkeit der Zahlen. Gibt es eine Möglichkeit, diese Arrays ohne For-Schleife zu vergleichen?

ich zur Zeit versucht, sie vergleichen Sie diese Zeile mit:

assertArrayEquals(expected, actual); 

Ich habe Beispiele gesehen, wo sie so etwas tun würde:

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

Dies sollte jedoch arbeiten, bekomme ich 'Kann Methode assertArrayEquals (double [], double [], double)' nicht auflösen '. Gibt es eine äquivalente Methode, die ich in meiner JUnit-Version (4.12) verwenden kann - wenn nicht, wie kann ich meine JUnit in IntelliJ aktualisieren? Ich habe erst kürzlich damit begonnen, diese IDE zu verwenden.

Wirklich zu schätzen jede Hilfe, danke.

+0

'assertArrayEquals' wird auch irgendwo eine Schleife verwenden. –

+0

Sie können die Mathematik manuell mit Hilfe der Division durch die Genauigkeit gefolgt von Rundung machen zB Math.round (a/0.0001) == Math.round (b/0.0001) – copeg

+0

Warum nicht benutzerdefinierte Array gleich schreiben und 'boolean' übergeben, um an zu behaupten? –

Antwort

0

Sie können den Unterschied zwischen den beiden Doppeln überprüfen und sicherstellen, dass sie mit einer Genauigkeit von bis zu n Ziffern verglichen werden. Wenn Sie zum Beispiel 0,0402666113 und 0,04027 vergleichen wollen, können Sie eine Bedingung für n schreiben = 4 wie:

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

So sind unsere Zahlen oben unter Verwendung der Absolutwert ihrer Differenz geringer ist als die Toleranz, so dass sie gelten als "gleich".

+0

In der Tat, das ist die Standardantwort aus Numerical Methods Lehrbüchern. Sie müssen etwas Toleranz angeben und bereit sein, Unterschiede zu akzeptieren, die darin enthalten sind. – mohsenmadi

+0

Seine Frage impliziert, dass er versteht, dass Gleitkommazahlen mit einem Delta-Wert verglichen werden sollten. Er fragt, wie man das elegant mit JUnit macht. Ihre Antwort beantwortet daher seine Frage nicht. – GhostCat

Verwandte Themen