2009-12-26 14 views
18

Tengo un método que devuelve un valor flotante como 1.234567890.Quiero probar que realmente lo hace. Sin embargo, parece que este flotante devuelto tiene una precisión diferente en diferentes plataformas, entonces, ¿cómo afirmo que el valor devuelto es 1.23456789? Si acabo de hacer:Afirmaciones de pruebas PHP y unidades con decimales

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

Entonces eso podría fallar en algunas plataformas donde no hay suficiente precisión.

Respuesta

5

Para una mayor precisión, puede considerar el uso de BCMath.

+0

bccomp() se adapta a mi situación bien. – Tower

0

alternativa de utilizar bcmath() también se puede ajustar la precisión por defecto, así:

ini_set('precision', 14); 
3

En general, es una mala idea probar los flotadores incorporados por la igualdad. Debido a accuracy problems de representación en coma flotante, los resultados de dos cálculos diferentes pueden ser perfectamente iguales matemáticamente, pero diferentes cuando los compara en su tiempo de ejecución de PHP.

Solución 1: compare lo lejos que están. Digamos, si la diferencia absoluta es menor que 0.000001, trata los valores como iguales.

Solución 2: use arbitrary precision mathematics, que admite números de cualquier tamaño y precisión, representados como cadenas.

+1

+1 por nunca probar carrozas por igualdad. Miedo cuántas personas no son conscientes de esto. Ojalá pudiera votar más ... – sleske

+0

Derecha, sleske. Lo aprendí hace mucho tiempo escribiendo mi propio programa de trazado de rayos, y me pregunto por qué solo tengo varios puntos en la pantalla en lugar de polígonos bellamente iluminados. :-) –

43

Hasta el momento no se ha mencionado que assertEquals soporta la comparación de los flotadores, ofreciendo un delta a specifiy precisión: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals.example2

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

Creo que quería decir $ this-> assertEquals (1.23456789, $ float, '', 0.0001); Tenga en cuenta el extra s. –

+0

tienes razón, gracias, lo arregló. –

+0

Me encantan las soluciones simples. Este debería ser el aceptado. La solución aceptada me haría cavar a través de BCMath durante una hora. –

Cuestiones relacionadas