Problemas de comparación de punto flotante MySQL

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 – … (rest 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?

¿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) 

Me enfrenté al problema similar una vez. Convierta el campo ‘flotante’ en ‘decimal’. Definitivamente resolverá el problema.

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.

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

Comparando un número con una cadena?