Donnée au format double inexploitable [Résolu]

Signaler
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018
-
salut67
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018
-
Bonjour,
j'ai une base et des données que je ne gère pas, mais que j'utilise. Une colonne au format double me pose problème. Exemple :

db2 => select x from mytable
X
------------------------
  +1,00000000000000E-001
  +1,00000000000000E-001
  +1,00000000000000E-001
  +1,00000000000000E-001
  4 record(s) selected.

db2 => select case x when 0.1 then 'O' else 'N' end from mytable
1
-
N
N
O
O


Le SELECT me donne la même valeur 0.1 pour toutes les lignes. Mais le CASE indique le contraire. Que les valeurs ne soient pas "exactement " 0.1, je veux bien, mais le SELECT ne devrait-il pas alors afficher quelque chose du genre +9,999999999999E-002 ?

Je lis les données depuis un programme C qui semble alors tomber dans le même travers : une comparaison indique que seules 2 données sont à 0,1 mais quand je les affiche par printf('%g") elles sont toutes à 0,1 !

Du coup, je n'arrive pas à exploiter correctement cette donnée. Une explication ? Une idée de la manière de les lire ? Merci bien.

Jean-Claude

1 réponse

Messages postés
14620
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
19 janvier 2020
138
Faire un test d'égalité sur est flottants est une grosse erreur.
Et il t'affiche 1.0E-1 car il arrondi le dernier chiffre à l'affichage.

Je te recommande plutôt de faire une fourchette genre >0.99999998 && <1.000000001

Pour l'affichage, c'est à toi de remettre en forme au moment de l'affichage.
salut67
Messages postés
27
Date d'inscription
mercredi 19 janvier 2011
Statut
Membre
Dernière intervention
1 novembre 2018

Merci de cette réponse rapide, c'est ce que je craignais.
Pas joli (désolé), pas pratique à maintenir (si j'ai d'autres bornes comme ce 0.1), mais je viens de la mettre en place, ça semble fonctionner.
Je prends.