texto - text en mysql
Problemas de comparaciĆ³n de punto flotante MySQL (6)
Comparando un número con una cadena?
Me encontré con un problema al introducir columnas de coma flotante en el esquema de la base de datos MySQL que las comparaciones en los valores de coma flotante no siempre arrojan los resultados correctos.
1 - 50.12
2 - 34.57
3 - 12.75
4 - ... (resto todo menos de 12.00)
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Esto me devuelve "3".
He leído que las comparaciones de los valores de coma flotante en MySQL son una mala idea y el tipo decimal es la mejor opción.
¿Tengo alguna esperanza de seguir adelante con el tipo de letra flotante y hacer que las comparaciones funcionen correctamente?
Es un punto flotante, ¿cuál es el problema? 3 podría ser el resultado correcto, depende de lo que la base de datos piensa acerca de 12.75. ¿Es 12.75 o solo un poco más?
Use DECIMAL si quiere números exactos.
Hay un problema con la comparación de flotadores por la igualdad. Esto puede dar resultados imprevistos. Esto se debe a la implementación interna de aritmética de coma flotante.
Me enfrenté al problema similar una vez. Convierta el campo ''flotante'' en ''decimal''. Definitivamente resolverá el problema.
¿Notaste 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 diferencial adicional de 0.00000005722
entre algunas de esas filas. Por lo tanto, algunos de esos valores devolverán falso en comparación 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
datos DECIMAL
:
ALTER TABLE a MODIFY num DECIMAL(6,2);
SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
| 159.94 |
+----------+
1 row in set (0.00 sec)
hago esto
WHERE abs(value - 12.75)<0.001
pero estoy de acuerdo, cualquier lenguaje puede comparar la igualdad de flotación y si los valores almacenados son iguales a los valores de los números exactos que usted insertó, no debería haber ningún problema
con solo un par de decimales y valores coincidentes exactos, los errores de precisión no suenan como una razón obvia para tales desajustes en MySQL