2009-12-26 6 views
18

Ich habe eine Methode, die einen Float wie 1.234567890 zurückgibt. Ich möchte testen, ob es wirklich so tut. Es scheint jedoch, dass dieser zurückgegebene Float unterschiedliche Genauigkeit auf verschiedenen Plattformen hat, also wie behaupte ich, dass der zurückgegebene Wert 1.23456789 ist? Wenn ich es einfach mache:PHP und Unit Testing Zusicherungen mit Dezimalzahlen

$this->assertEqual(1.23456789, $float); 

Dann könnte das auf einigen Plattformen fehlschlagen, wo es nicht genug Präzision gibt.

Antwort

5

Für eine höhere Genauigkeit können Sie die Verwendung von BCMath in Erwägung ziehen.

+0

bccomp() passt meine Situation in Ordnung. – Tower

0

Alternativ verwenden bcmath() Sie auch die Standardgenauigkeit, wie dies einstellen:

ini_set('precision', 14); 
3

Im Allgemeinen ist es eine schlechte Idee, Einbau-Schwimmer für Gleichheit zu testen. Aufgrund von der Gleitkommadarstellung können die Ergebnisse von zwei verschiedenen Berechnungen mathematisch perfekt gleich sein, aber anders, wenn Sie sie zu Ihrer PHP-Laufzeit vergleichen.

Lösung 1: vergleichen Sie, wie weit sie voneinander entfernt sind. Angenommen, die absolute Differenz ist kleiner als 0,000001, behandeln Sie die Werte als gleich.

Lösung 2: Verwenden Sie arbitrary precision mathematics, die Zahlen beliebiger Größe und Genauigkeit unterstützt, die als Strings dargestellt werden.

+1

+1 für das Testen von Floats auf Gleichheit. Unheimlich, wie viele Menschen sich dessen nicht bewusst sind. Ich wünschte, ich könnte mehr upvote ... – sleske

+0

Richtig, sleske. Ich habe es vor sehr langer Zeit gelernt, als ich mein eigenes Ray-Tracing-Programm geschrieben habe, und habe mich gefragt, warum ich nur einige Punkte auf dem Bildschirm anstelle von schön beleuchteten Polygonen bekomme. :-) –

43

Bisher ist es nicht erwähnt, dass assertEquals unterstützt, indem sie eine Delta-Schwimmer Vergleich Präzision specifiy: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals.example2

$this->assertEquals(1.23456789, $float, '', 0.0001); 
+0

Ich glaube du meintest $ this-> assertEquals (1.23456789, $ float, '', 0.0001); Beachten Sie die zusätzlichen s. –

+0

Sie haben Recht, danke, repariert es. –

+0

Liebe die einfachen Lösungen. Dies sollte der akzeptierte sein. Akzeptierte Lösung würde mich für eine Stunde durch BCMath graben lassen. –