2012-07-24 17 views
6

Estoy escribiendo un script PHP que mira a través de una tabla de base de datos de valores de coma flotante, que tienden a ser un poco pequeña, tales como:¿Por qué MySQL está devolviendo algunos flotantes en notación científica, pero no en otros?

0.00052 
0.00134 
0.00103 
0.00149 
0.00085 
0.00068 
0.00077 
0.00088 
0.00169 
0.00063 

Por razones desconocidas para mí, algunos valores aparecen en la base de datos en la científica notación, tales como:

1.12305e-06

La mesa está puesta a flote, y he probado todo tipo de funciones en PHP para obligar a los números para mostrar como decimal, sin ningún resultado. Por más que lo intente, no puedo conseguir que esta tabla de números sea consistentemente decimal en todos los casos.

¿Alguna sugerencia sobre cómo resolver esto? He intentado usar el typcasting en (float) y usando number_format() y varias otras opciones, pero no cambio cada vez.

+0

No estoy seguro de la parte superior de mi cabeza, pero ¿MySQL muestra valores en notación científica? Sé que PHP lo hace con seguridad. ¿Puedes mostrar un caso de prueba más completo sobre cómo manejas esos valores? – deceze

+2

¿Cómo los muestras para descubrir que están en este formato? ¿Es mysql que los devuelve así, o es solo la representación de php? usas 'var_dump',' echo', 'print', etc.? – Nanne

+1

¿Alguna razón por la que no está utilizando un tipo de datos 'DECIMAL'? – Romain

Respuesta

2

Parece haber un límite de seis dígitos en lo que se muestra en la CLI (y probablemente en otro lugar). El ejemplo que tiene es 1.12305e-06 que es 0.00000112305 que se mostraría como 0.00000, aunque claramente no es cero.

Si insiste en utilizar flotantes o dobles, deberá forzarlos a utilizar algo como round(columnName,5) para forzar la visualización en un valor decimal. De lo contrario, tal vez cambie a un tipo de datos decimales.

De http://dev.mysql.com/doc/refman/5.0/en/floating-point-types.html

Dado que los valores de punto flotante son aproximados y no se almacenan como valores exactos, los intentos de tratarlos como exacta en las comparaciones pueden dar lugar a problemas. También están sujetos a dependencias de plataforma o implementación. Para obtener más información, consulte la Sección C.5.5.8, "Problems with Floating-Point Values"

Consulte también este thread en los foros de mysql sobre este problema exacto.

0

La solución en mi caso resultó estar cambiando de tipo flotante a decimal en la base de datos, ¡así que gracias a Romain por el comentario que me llevó a buscar esa solución!

Cuestiones relacionadas