sql >> Base de Datos >  >> RDS >> Mysql

Problemas de comparación de punto flotante de MySQL

¿Notas el problema a continuación?

CREATE TABLE a (num float);

INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);

SELECT SUM(num) FROM a;
+-----------------+
| SUM(num)        |
+-----------------+
| 159.94000005722 | 
+-----------------+

Hay un 0.00000005722 extra repartidas entre algunas de esas filas. Por lo tanto, algunos de esos valores devolverán false cuando se comparen con el valor con el que se inicializaron.

Para evitar problemas con la aritmética de coma flotante y las comparaciones, debe usar el DECIMAL tipo de datos:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
|   159.94 | 
+----------+
1 row in set (0.00 sec)