Donnée au format double inexploitable

Résolu
salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018 - 31 oct. 2018 à 15:13
salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018 - 1 nov. 2018 à 08:47
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

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
31 oct. 2018 à 18:41
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.
0
salut67 Messages postés 27 Date d'inscription mercredi 19 janvier 2011 Statut Membre Dernière intervention 1 novembre 2018
1 nov. 2018 à 08:47
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.
0
Rejoignez-nous