Maison >base de données >tutoriel mysql >Pourquoi MySQL renvoie-t-il des résultats inattendus lors de la comparaison de nombres à virgule flottante ?

Pourquoi MySQL renvoie-t-il des résultats inattendus lors de la comparaison de nombres à virgule flottante ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-10 16:34:02813parcourir

Why does MySQL return unexpected results when comparing floating-point numbers?

Anomalies de comparaison à virgule flottante MySQL

Les nombres à virgule flottante sont généralement connus pour provoquer des résultats inattendus dans les comparaisons en raison de leur nature imprécise. MySQL ne fait pas exception à ce comportement.

Imaginez ce scénario : une table MySQL avec une colonne nommée "points" qui stocke des valeurs à virgule flottante. Lors de l'exécution d'une requête telle que :

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

vous pouvez vous attendre à ce qu'elle renvoie 3, car il existe quatre valeurs supérieures à 12,75. Cependant, MySQL peut ne renvoyer que 2.

Ce comportement est une conséquence de la manière dont l'arithmétique à virgule flottante est implémentée dans les ordinateurs. Bien que notre code stocke des valeurs telles que « 12,75 » ou « 50,12 », ces valeurs sont souvent stockées en interne sous forme d'approximations. Pour illustrer cela, prenons la simple somme de quelques nombres à virgule flottante :

Cette requête pourrait renvoie un résultat comme "159.94000005722" au lieu de "159.94". Ce "0,00000005722" supplémentaire est le résultat d'erreurs d'arrondi internes à l'arithmétique à virgule flottante.

Résolution du problème avec le type DECIMAL

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;

Pour éviter de telles inexactitudes, il est recommandé de utilisez le type de données DECIMAL. DECIMAL représente les valeurs sous forme de chaînes avec un nombre fixe de chiffres, plutôt que de s'appuyer sur des approximations à virgule flottante.

Avec ce changement, la requête SUM renverra le résultat attendu de "159,94".

Conclusion

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;

Bien que les types à virgule flottante puissent être pratiques pour certaines applications, leur comparaison les comportements peuvent être peu fiables dans MySQL. Pour des comparaisons et des calculs précis, il est fortement recommandé d'utiliser plutôt le type de données DECIMAL.

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!

Déclaration:
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