Problème de multiplication décimal

Résolu
Compufly Messages postés 15 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 21 octobre 2006 - 21 oct. 2006 à 17:48
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 21 oct. 2006 à 21:49
Bonjour, est-ce que quelqu'un peut m'expliquer pourquoi j'ai ce problème :

PRINT 4 * 0.2
 0,8

PRINT "4" * "0,2"
 0,8

print rst2.Fields(foo) * rst1.Fields(foo)
 0,800000011920929

Lorsque : rst2.=Fields(foo) = 4 et rst1.Fields(foo) = 0,2

Je ne comprends pas pourquoi VB6 traite ces multiplications différemment.

Merci d'avance,

Compufly

6 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 oct. 2006 à 21:49
Cela ne vient pas "vraiment" de vb6, mais du système de codage des nombres : il est impossible de coder tout les réels sur 32 bits, du coup, vb (comme la grande majorité des langages) doivent faire une approximation des nombres pour pouvoir les stocker. Malheureusement, cela n'est pas parfait, et donne des résultats surprenants pour certains nombres.
Alors soit tu utilise la fonction Format à la fin de ton calcul (et là ca devrait marcher), soit utilise des variables String pour stocker tes nombres (ce sera moins efficace, mais au moins ca stockera les bons chiffres avec la fonction Format).
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 oct. 2006 à 17:51
convertit les nombres obtenus (bien souvent, le système de codage des nombres est différent entre une base de données et vb6 => à tout les coup, ta base de données ne sait pas comment coder correctement 0.8 (problème du complèment à deux bien connu en prog))

Donc ca donne :
rst2.=format(Fields(foo) = 4 et rst1.Fields(foo) = 0,2, "0.00")
0
Compufly Messages postés 15 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 21 octobre 2006
21 oct. 2006 à 18:01
rst2.=format(Fields(foo) = 4 et rst1.Fields(foo) = 0,2, "0.00")

Humph, je ne crois pas que de cette façon...

En fait, rst2.Fields contient le résultat de
SELECT * FROM [JOUEURS] WHERE POSITION = 'G';

et rst1.Fields contient le résultat de
SELECT * FROM [POINTAGE]

 Donc mon problème est que VB6 reçoit dans :
rst2.Fields(foo) la valeur 4
et
rst1.Fields(foo) la valeur 0,2

Mais quand je fais :
pointage = pointage + rst2.Fields(foo) * rst1.Fields(foo)
J'obtient le nombre
0,800000011920929

Donc le format, de quelle façon puis-je l'employer dans cet exemple si ça se tient toujours?

Compufly
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
21 oct. 2006 à 18:41
ca ne change rien : la fonction format te permettra de préciser la précision de l'opération, donc ici, 2 chiffres après la virgule, ce qui évite ce problème de complément à 2, donc ca donne :

pointage = pointage + format(rst2.Fields(foo) * rst1.Fields(foo), "0.00")
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Compufly Messages postés 15 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 21 octobre 2006
21 oct. 2006 à 21:16
ppj = ppj + Format(Format(rst2.Fields(foo), "0.0") * Format(rst1.Fields(foo), "0.0"), "0.0")

Me donne quand même des résultats du genre :
0,9000001

Je crois que je n'aurai pas le choix d'utiliser la fonction ROUND(rst1.Fields(foo), 1) etc.

Compufly
0
Compufly Messages postés 15 Date d'inscription vendredi 2 septembre 2005 Statut Membre Dernière intervention 21 octobre 2006
21 oct. 2006 à 21:18
 ppj = ppj + Round(rst2.Fields(foo), 1) * Round(rst1.Fields(foo), 1)

Même cette commande me donne le même résultat.
On dirait que VB6 fait des troubles quand vient le temps de calculer des ","

Compufly
0
Rejoignez-nous