Maison >base de données >tutoriel mysql >Pourquoi les comparaisons à virgule flottante dans MySQL sont-elles inexactes ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-10 21:42:02807parcourir

Why are Floating-Point Comparisons in MySQL Inaccurate?

Défis de comparaison de valeurs à virgule flottante MySQL

Les utilisateurs de MySQL rencontrent souvent des inexactitudes lors de la comparaison de valeurs à virgule flottante. Prenons l'exemple suivant :

CREATE TABLE users (points float);
INSERT INTO users VALUES (50.12);
INSERT INTO users VALUES (34.57);
INSERT INTO users VALUES (12.75);

La requête SELECT COUNT(*) FROM utilisateurs WHERE points > "12.75" renvoie 3, alors qu'on s'attend à un décompte de 2.

Le problème avec l'arithmétique à virgule flottante

MySQL utilise l'arithmétique à virgule flottante pour stocker et manipuler le type flottant valeurs. Ce système représente les nombres en utilisant une combinaison d'une mantisse (le nombre réel) et d'un exposant, ce qui entraîne des problèmes potentiels de précision. Par exemple, la valeur 12,75 peut être stockée sous la forme 12,75000005722 lorsqu'elle est saisie dans MySQL en raison de la représentation binaire des nombres à virgule flottante.

Représentation décimale exacte

Pour éviter une telle inexactitudes, il est recommandé d'utiliser le type de données DECIMAL dans MySQL pour une représentation décimale précise. Contrairement à float, DECIMAL stocke les valeurs sous forme de nombres à virgule fixe, garantissant une précision exacte.

Conversion en DECIMAL

Pour convertir une colonne flottante existante en DECIMAL, utilisez ALTER TABLE déclaration :

ALTER TABLE users MODIFY points DECIMAL(6,2);

Cela convertira les points en une colonne décimale avec 6 chiffres au total et 2 décimales lieux. Vous pouvez ajuster la précision et l'échelle selon vos besoins.

Conclusion

Bien que float puisse sembler pratique, les inexactitudes inhérentes à l'arithmétique à virgule flottante peuvent conduire à des résultats inattendus lors de la comparaison valeurs. Pour une représentation décimale précise et des comparaisons précises, il est fortement recommandé d'utiliser le type de données DECIMAL dans MySQL. En utilisant DECIMAL, vous pouvez éviter les pièges potentiels des comparaisons à virgule flottante et garantir la fiabilité de vos données.

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