2009-12-26 10 views
18

Ho un metodo che restituisce un float come 1.234567890.Voglio verificare che lo faccia davvero. Tuttavia, sembra che questo float restituito abbia una precisione diversa su piattaforme diverse, quindi come faccio ad affermare che il valore restituito è 1.23456789? Se devo solo:Asserzioni di test in PHP e unità con decimali

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

Quindi questo potrebbe non riuscire su alcune piattaforme dove non c'è abbastanza precisione.

risposta

5

Per maggiore precisione si può considerare l'utilizzo di BCMath.

+0

bccomp() adatta la mia situazione bene. – Tower

0

alternativa di utilizzare bcmath() è anche possibile impostare la precisione di default, in questo modo:

ini_set('precision', 14); 
3

In generale, si tratta di una cattiva idea per testare carri built-in per l'uguaglianza. A causa di accuracy problems di rappresentazione in virgola mobile, i risultati di due calcoli diversi possono essere perfettamente uguali matematicamente, ma diversi quando li si confronta al runtime di PHP.

Soluzione 1: confronta quanto distanti sono. Supponi che, se la differenza assoluta è inferiore a 0,000001, i valori vengono considerati uguali.

Soluzione 2: utilizzare arbitrary precision mathematics, che supporta numeri di qualsiasi dimensione e precisione, rappresentati come stringhe.

+1

+1 per non testare mai i galleggianti per l'uguaglianza. Spaventoso quante persone non sono a conoscenza di questo. Vorrei poter invitare di più ... – sleske

+0

Giusto, sleske. L'ho imparato molto tempo fa scrivendo il mio programma di ray tracing e chiedendomi perché ottengo solo più punti sullo schermo invece di poligoni splendidamente illuminati. :-) –

43

Finora non è stato detto che assertEquals supporta il confronto carri, offrendo un delta in modo da precisare precisione: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals.example2

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

Penso che intendessi $ this-> assertEquals (1.23456789, $ float, '', 0.0001); Nota le extra s. –

+0

hai ragione, grazie, risolto. –

+0

Ama le soluzioni semplici. Questo dovrebbe essere accettato. La soluzione accettata mi farebbe scavare attraverso BCMath per un'ora. –