Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] MYSQL consulta con datos tipo float

Estas en el tema de MYSQL consulta con datos tipo float en el foro de Mysql en Foros del Web. Hola, tengo una tabla en mi BD del tipo float; cuando inserto mis datos y los visualizo no tengo problema, mi problema radica en que ...
  #1 (permalink)  
Antiguo 23/08/2013, 11:08
 
Fecha de Ingreso: agosto-2013
Ubicación: Oaxaca
Mensajes: 7
Antigüedad: 10 años, 7 meses
Puntos: 0
Pregunta MYSQL consulta con datos tipo float

Hola,
tengo una tabla en mi BD del tipo float; cuando inserto mis datos y los visualizo no tengo problema, mi problema radica en que cuando hago una consulta select en que dicho dato flotante sea mi criterio de búsqueda; la consulta no me devuelve nada, pero al revisar la BD si se encuentra el dato flotante almacenado.
Gracias por su ayuda, y si en algo no me expliqué bien díganmelo para aclarar mi pregunta. GRACIAS
  #2 (permalink)  
Antiguo 23/08/2013, 11:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: MYSQL consulta con datos tipo float

Postea la consulta que haces, y recuerda que un valor FLOAT es un numero por aproximación, no de precisión, por lo que en realidad un 1538.56 no se almacena exactamente como tal, sino algo distinto...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 23/08/2013, 11:41
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: MYSQL consulta con datos tipo float

Tal como lo comenta gnzsoloyo, el detalle es que FLOAT es un tipo de datos de aproximación, no de precisión, checa este articulo:

http://blog.eleazan.net/2013/07/mysql-float-vs-decimal/

observa qué es lo que pasa con las búsquedas si se declara como tipo float:

Código MySQL:
Ver original
  1. mysql> create table tabla_float (Id varchar(20), valor float);
  2. Query OK, 0 rows affected (0.35 sec)
  3.  
  4. mysql> insert into tabla_float values
  5.     -> ('uno', 1),
  6.     -> ('dos', 2.2),
  7.     -> ('tres', -0.03),
  8.     -> ('cuatro', 10.0e2),
  9.     -> ('cinco', -10.0e-2);
  10. Query OK, 5 rows affected (0.02 sec)
  11. Records: 5  Duplicates: 0  Warnings: 0
  12.  
  13. mysql> select * from tabla_float;
  14. +--------+-------+
  15. | Id     | valor |
  16. +--------+-------+
  17. | uno    |     1 |
  18. | dos    |   2.2 |
  19. | tres   | -0.03 |
  20. | cuatro |  1000 |
  21. | cinco  |  -0.1 |
  22. +--------+-------+
  23. 5 rows in set (0.08 sec)
  24.  
  25. mysql> select * from tabla_float where valor = 1;
  26. +------+-------+
  27. | Id   | valor |
  28. +------+-------+
  29. | uno  |     1 |
  30. +------+-------+
  31. 1 row in set (0.00 sec)
  32.  
  33. mysql> SELECT * FROM tabla_float WHERE valor = -0.03;
  34. Empty set (0.00 sec)
  35.  
  36. mysql> SELECT * FROM tabla_float WHERE valor = 10.0e2;
  37. +--------+-------+
  38. | Id     | valor |
  39. +--------+-------+
  40. | cuatro |  1000 |
  41. +--------+-------+
  42. 1 row in set (0.00 sec)
  43.  
  44. mysql> SELECT * FROM tabla_float WHERE valor = -10.0e-2;
  45. Empty set (0.00 sec)

Observa que siempre en los casos donde la cifra tienen un punto decimal, las consultas no "funcionan"... la explicación también te la da gnzsoloyo:

Cita:
por lo que en realidad un 1538.56 no se almacena exactamente como tal, sino algo distinto...
si quieres evitar esto, puedes utilizar el tipo de datos DOUBLE:

Código MySQL:
Ver original
  1. mysql> CREATE TABLE tabla_double (Id VARCHAR(20), valor DOUBLE);
  2. Query OK, 0 rows affected (0.33 sec)
  3.  
  4. mysql> INSERT INTO tabla_double VALUES
  5.     -> ('uno', 1),
  6.     -> ('dos', 2.2),
  7.     -> ('tres', -0.03),
  8.     -> ('cuatro', 10.0e2),
  9.     -> ('cinco', -10.0e-2);
  10. Query OK, 5 rows affected (0.03 sec)
  11. Records: 5  Duplicates: 0  Warnings: 0
  12.  
  13. mysql> SELECT * FROM tabla_double;
  14. +--------+-------+
  15. | Id     | valor |
  16. +--------+-------+
  17. | uno    |     1 |
  18. | dos    |   2.2 |
  19. | tres   | -0.03 |
  20. | cuatro |  1000 |
  21. | cinco  |  -0.1 |
  22. +--------+-------+
  23. 5 rows in set (0.00 sec)
  24.  
  25. mysql> select * from tabla_double where valor = 1;
  26. +------+-------+
  27. | Id   | valor |
  28. +------+-------+
  29. | uno  |     1 |
  30. +------+-------+
  31. 1 row in set (0.00 sec)
  32.  
  33. mysql> SELECT * FROM tabla_double WHERE valor = -0.03;
  34. +------+-------+
  35. | Id   | valor |
  36. +------+-------+
  37. | tres | -0.03 |
  38. +------+-------+
  39. 1 row in set (0.00 sec)
  40.  
  41. mysql> SELECT * FROM tabla_double WHERE valor = 10.0e2;
  42. +--------+-------+
  43. | Id     | valor |
  44. +--------+-------+
  45. | cuatro |  1000 |
  46. +--------+-------+
  47. 1 row in set (0.00 sec)
  48.  
  49. mysql> SELECT * FROM tabla_double WHERE valor = -10.0e-2;
  50. +-------+-------+
  51. | Id    | valor |
  52. +-------+-------+
  53. | cinco |  -0.1 |
  54. +-------+-------+
  55. 1 row in set (0.00 sec)

Saludos
Leo.
  #4 (permalink)  
Antiguo 23/08/2013, 11:42
 
Fecha de Ingreso: agosto-2013
Ubicación: Oaxaca
Mensajes: 7
Antigüedad: 10 años, 7 meses
Puntos: 0
Sonrisa Respuesta: MYSQL consulta con datos tipo float

Ya lo he solucionado solo tenía que hacer la consulta así:
select campo from tabla where cast(Calif as decimal)=cast(9.66 as decimal);
donde calif es el campo flotante.
De cualquier forma gracias!
  #5 (permalink)  
Antiguo 23/08/2013, 12:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: MYSQL consulta con datos tipo float

No compliques las cosas.
Si vas a usar una columna que tiene una cantidad restringida de decimales (como por ejemplo en precios o calificaciones de estudiantes), debes usar DECIMAL y no FLOAT.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:24.