Demande d'explication

millenium -  
pilas31 Messages postés 1878 Statut Contributeur -
Je vous transmit ci après la fonction toto que j'ai programmé en langage VBA sous EXCEL et j'ai rencontré un problème que je n'arrive pas à résoudre.

********** Fonction toto ************
Function toto(sect_x As Double) As Double
Dim pas, alpha As Double
Dim i As Integer
pas = sect_x / 20
alpha = 0
For i = 1 To 20
alpha = alpha + pas
Next i
If alpha <= sect_x Then toto = 100 Else toto = -1
End Function
***********************************
Explication du problème :
En exécutant la fonction toto ci-dessus pour une valeur de la variable sect_x=11. Normalement à la 20ième itération de la valeur de i, ont devrais avoir alpha=sect_x et par conséquent, toto renvoi la valeur 100. Malheureusement, la valeur renvoyée est de -1 c.à.d que la condition sous le if à la 20ième itération est false. C'est bizarre.
J'ai ensuite tenté de remplacer la condition sous le if par alpha-sect_x=0 pour tester la différence entre les deux variables à la 20ième itération de i le problème persiste.
La valeur de alpha-sect_x est non nulle. Elle est de 1.776E-17 d'où vient cette différence c'est ca le problème.
Ensuite j'ai demander à la fonction toto de me renvoyer la valeur de alpha à la 20ième itération de i. La valeur que j'ai reçue est exactement 11.00E+0 c.à.d que alpha=sect_x ce qui n'est pas le cas.
Je vous pris de bien vouloir me donner des conseilles pour résoudre ce problème .
cordialement

1 réponse

pilas31 Messages postés 1878 Statut Contributeur 647
 
Bonjour,

C'est un problème assez classique en vba des que l'on utilise les nombres en double précision ou même simple précision ou en variant.
Il ne faut pas faire de test d'égalité car on tombe sur la limite de précision d'excel.

Je ne vois que deux solutions soit utiliser le type Currency qui accepte une précision de 15 chiffres avant la virgule et 4 chiffres après (ça fonctionne) soit faire le test d'égalité avec une certaine tolérance.

A+
Cordialement,
0