Pregunta

me encontré con un problema con la introducción de columnas de punto flotante en el esquema de base de datos MySQL que las comparaciones de valores de coma flotante no devuelven los resultados correctos siempre.

1 - 50.12
2 - 34.57
3 - 12.75
4 - ... (descansar a menos de 12.00)

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"

Esto devuelve mí "3".

He leído que las comparaciones de los valores de punto flotante en MySQL es una mala idea y el tipo decimal es la mejor opción.

¿Tengo alguna esperanza de seguir adelante con el tipo de flotador y obtener correctamente las comparaciones con el trabajo?

¿Fue útil?

Solución

¿Notas el problema de abajo?

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 una propagación 0.00000005722 extra entre algunas de esas filas. Por lo tanto, algunos de esos valores volverán falsa cuando se compara con el valor que se inicializan con.

Para evitar problemas con la aritmética de punto flotante y las comparaciones, se debe utilizar el tipo de 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)

Otros consejos

Lo hice cara del problema similar una vez. Convertir el campo 'flotar' a 'decimal'. Definitivamente va a resolver el problema.

Lo hago

WHERE abs(value - 12.75)<0.001

pero estoy de acuerdo, cualquier idioma puede comparar la igualdad flotador y si los valores almacenados es igual a los valores de los números exactos que ha insertado, no debería haber ningún problema

con sólo un par de decimales y los valores exactos que coinciden, los errores de precisión no suena como una razón obvia para tales desajustes en MySQL

Es un punto flotante, así que cuál es el problema? 3 podría ser el resultado correcto, depende de lo que cree la base de datos sobre 12.75. Es 12.75 o simplemente un poco más?

Uso decimal si desea que los números exactos.

Hay un problema con la comparación de flotadores para la igualdad. Esto puede dar resultados impredecibles. Esto se debe a la aplicación interna de la aritmética de punto flotante.

La comparación de un número con una cadena?

El uso real en lugar de FLOAT o decimal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top