Se connecter / S'enregistrer

Résolu Comparaisons avec des valeurs de type FLOAT

Solutions (6)
Tags :
  • MySQL
  • Programmation
|
Je suis tombé sur un problème avec MySQL qui m'a un peu surpris, donc je le signale ça peut servir à d'autres.

Voici la requête :

SELECT toto_sexe_id FROM toto_sexe WHERE toto_sexe_iip >= 4.77


toto_sexe_iip est de type FLOAT.
Dans ma table j'ai bien des valeurs supérieures ou égales à 4.77 pour ce champ.

Seulement la requête ne me retourne aucun résultats.

Du coup je me suis rapidement renseigné et d'après ce que j'ai compris les valeurs de type FLOAT sont stockées de façon approximative.
En réalité ma valeur n'est pas exactement égale à 4.77 , elle est située entre 4.769999... et 4.77.

Si vous avez déjà été confronté au problème, quelle solution avez-vous appliqué ?

Merci
Contenus similaires
  • Autres pages sur : comparaisons valeurs type float
Meilleure solution
partage
|
Quelque soit le langage de programmation, pour les flottants, il faut toujours prévoir une valeur (que j'appelle habituellement epsilon) très faible qui permet de faire les tests avec égalité.
0.0001 est généralement une bonne valeur, mais ça dépend du contexte.

Pas la peine de passer par ABS(), il suffit de tester: toto_sexe_iip > 4.77 - epsilon
  • Commenter cette solution |
Score
0
òh
òi
|
Meilleure réponse sélectionnée par D_Sanchez.
  • Commenter cette réponse |
Score
0
òh
òi
|
Merci [:bob-m:3]
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Je n'ai pas essayé, mais d'après la doc (voir lien que j'ai donné au dessus), il ne faudrait pas utiliser ROUND.
  • Commenter cette réponse |
Score
0
òh
òi
|
Ou bien, tu peux utiliser ROUND (arrondi):
  1. SELECT toto_sexe_id FROM toto_sexe WHERE ROUND(toto_sexe_iip, 2) >= 4.77
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Salut,

Je n'ai jamais été confronté au problème spécifiquement, mais d'après la doc ( http://dev.mysql.com/doc/refman/5.0/en/problems-with-fl... ), il faut décider d'une tolérance que tu veux, et faire la comparaison comme ça :
SELECT toto_sexe_id FROM toto_sexe WHERE ABS(toto_sexe_iip - 4.77) <= 0.0001


Edit: ça, ça te donnera tous ceux où toto_sexe_iip est quasiment égal à 4,77
Du coup, si tu veux, supérieur ou égal, il faudrait faire quelque chose comme ça :
SELECT toto_sexe_id FROM toto_sexe WHERE ABS(toto_sexe_iip - 4.77) <= 0.0001 OR toto_sexe_iip > 4,77
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS