Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi les comparaisons à virgule flottante MySQL sont-elles inexactes ?

Susan Sarandon
Libérer: 2024-11-07 12:12:02
original
455 Les gens l'ont consulté

Why Are MySQL Floating-Point Comparisons Inaccurate?

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)
Copier après la connexion

Exécution de la requête :

SELECT COUNT(*) FROM `users` WHERE `points` > "12.75"
Copier après la connexion

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);
Copier après la connexion

Exécution de la requête :

SELECT SUM(num) FROM a;
Copier après la connexion

donne le résultat :

159.94000005722
Copier après la connexion

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;
Copier après la connexion

Le résultat devient maintenant :

159.94
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal