violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
13 nov. 2005 à 14:15
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
13 nov. 2005 à 16:25
Violent Ken
Salut à toi, Ô grande communauté de développeurs !
Plus sérieusement, j'ai un problème tout simple, mais je ne trouve pas la réponse; le voilà :
J'ai ce petit bout de code :
(N est un Double que l'utilisateur donne, et Fac un Double =0)
Fac = 0
While Int(N) < N
Fac = Fac + 1
N = 10 * N
DoEvents
Wend
Voici ce que c'est censé faire : on donne N (qui est un nombre décimal) et la boucle nous le multiplie par 10 jusqu'à ce qu'il soit entier.
exemple : si N=1.05, on aura N qui deviendra 105 et Fac=2.
Pas trop dur, n'est ce pas !
MAIS, pour N=1.12, ma boucle me donne N=1.12E+16 et Fac=16 ! Pourquoi donc ???
Pour N=20.451, le résultat est le bon, mais pour N=1.12, pas moyen ??
J'ai donc trouvé le stratagème de faire :
While Len(Str$(Int(N))) < Len(Str$(N))
au mieux du While existant.
Ca marche désormais, mais ou est le bug dans la précédente boucle ??
Si vous trouvez pas, c'est pas grave, mais quand même, c'est incompréhensible et j'aimerais bien connaître le raison de ce bug ! Est ce vb6.exe qui foire ??
@+
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 13 nov. 2005 à 16:15
Salut, effectivement, le double en vb6 est très imprécis après un certain nombre de décimales (je crois que 14 c'est le max, à voir). Certaines valeurs comme 1.12 (et d'autres) prennent un 1 en 15ème décimale et plus. Le pourquoi ? pb de processeur, de conversion, ... ?
Pour ton prob, essaie cette solution :
While Int(N) < Round(N, 8)
Fac = Fac + 1
N = 10 * Round(N, 8)
DoEvents
Wend
J'ai mis Round(N, 8) mais tu peux mettre moins ou plus (mais pas plus de 14), ça dépend de la précision que tu veux obtenir. Je te laisse tester.
Je sais bien que le round... se répète mais autrement ça plante quand même car le double remet ses décimales parasites à chaque calcul.
-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 13 nov. 2005 à 14:50
Violent Ken
Effectivement, le fait que Fac aille jusqu'à 16 indique la limite du type de données. MAIS
1) pourquoi çà marche pas avec Double ???
2) pourquoi çà marche avec 1.05 ; 1.65152 et pas 1.12 ???
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 13 nov. 2005 à 16:25
Violent Ken
Fac=0
While Len(Str$(Int(N))) < Len(Str$(N))
Fac = Fac + 1
N = 10 * N
DoEvents
Wend
Cette petite boucle marche aussi; quand les longueurs des chaînes sont identiques, cela signifie que la virgule a disparu.
Quant à la solution avec le round, çà marche aussi (8 est convenable), merci !
@+