Imperfections de la comparaison à virgule flottante MySQL
Bien que l'introduction de colonnes à virgule flottante dans un schéma de base de données MySQL s'avère utile, les comparaisons impliquant des valeurs à virgule flottante peuvent parfois donner résultats peu fiables.
Pour démontrer :
Considérons un tableau avec une colonne de points contenant les valeurs suivantes :
1 - 50.12 2 - 34.57 3 - 12.75 4 - ...(all other values are less than 12.00)
Exécution de la requête :
SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
renvoie de manière inattendue "3".
C'est un fait connu que les comparaisons MySQL de valeurs à virgule flottante sont sujettes à des incohérences et que le type de données décimal est un meilleur choix pour de telles comparaisons.
Pouvez-vous continuer à utiliser le type Float ?
Bien qu'il soit généralement recommandé d'utiliser le type de données DECIMAL pour des comparaisons précises en virgule flottante, vous pouvez toujours utiliser le type float si vous connaissez ses pièges potentiels. L'un de ces pièges est la possibilité d'une légère perte de précision lors des calculs.
Par exemple, considérons le tableau suivant :
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);
Exécution de la requête :
SELECT SUM(num) FROM a;
donne le résultat :
159.94000005722
Notez le "0.00000005722" inattendu. De telles erreurs d'arrondi peuvent entraîner des écarts dans les comparaisons.
Pour atténuer ces problèmes, vous pouvez convertir les colonnes flottantes en un type de données DECIMAL avec une précision et une échelle spécifiées. Par exemple :
ALTER TABLE a MODIFY num DECIMAL(6,2); SELECT SUM(num) FROM a;
Le résultat devient maintenant :
159.94
En utilisant le type de données DECIMAL, vous pouvez garantir des comparaisons précises et éviter les problèmes de précision associés aux valeurs à virgule flottante dans MySQL .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!