Ver Mensaje Individual
  #3 (permalink)  
Antiguo 23/08/2013, 11:41
leonardo_josue
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.