Probleme de somme boucle...

Résolu
GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Mon problème est très simple a comprendre, je fais une boucle, j´additionne les chiffres petit a petit est quand c´est égale a 1 une message box.

Fonctionne avec toutes mes combinaison, jusqu´au moment mes valeur sont 0.825, 0.1, 0.075; la somme fait 1 (vérifier et revérifier ça fait 1). Je fais des tests et des tests pour comprendre avec d´autres macros, d´autres valeurs, sur d´autres feuille et avec d´autres formats, rien ni fait je n´ai pas de msgbox qui apparait.

Mais lorsque je converti en texte pour faire ma comparaison si j´ai ma message box qui apparait....

Ça me dépasse, je ne comprends pas, alors je sollicite l´aide d´un d´entre vous qui aura plus de lucidité que moi...

Merci d´avance

Sub test()
Dim CantL As Double
With Sheets("Plantilla")
NbLi = .Range("A" & Rows.Count).End(xlUp).Row:  TB = .Range("A2:L" & NbLi)
For i = LBound(TB) To UBound(TB)
    CantL = CantL + CDbl(TB(i, 7))
    If CantL = 1 Then MsgBox "ok"
    If CStr(CantL) = "1" Then MsgBox "ok"
Next i
End With
End Sub

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonsoir germperu, je pense que c'est parce que 1 n'est pas toujours totalement égal à 1.
pour un ordi, 0.825 + 0.1 + 0.075 ne fait pas exactement 1. parce que l'ordi ne travaille pas avec une base décimale.
suggestion:
 Dim CantL As single
1
GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour et sacré toi... pour moi un chiffre a virgule est un chiffre a virgule et 1 ca reste 1...
en modifiant la déclaration de ma variable a single cela fonctionne avec tous mes exemples... Aurais tu une explication que 1 ça fait pas 1 en double mais 1 en single? Alors que les deux sont des décimales.

Merci :)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention  
 
explication: en double, 0.825 + 0.1 + 0.075 fait peut-être 1.0000000001
en single, moitié moins précis, cela fait 1.00000, donc 1
0
GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention  
 
Génial, je pense avoir saisi la subtilité du "peut-être" problème.

Par tout hasard je cherche a me perfectionner en VBA, est ce que tu aurais une bonne référence de livre ou cours a me conseiller.

Merci yg_be
0
GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention  
 
Ils ont mis ou le bouton "Résolu"?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention  
 
désolé, aucune idée
0
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
Bonjour

C'est une conséquence du codage des décimaux
Essaies en comparant la différence CantL-1 à un nombre proche de 0 par exemple
If abs(CantL - 1) < 0.00001 Then MsgBox "ok"

Cdlmnt
0
GermPeru Messages postés 172 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour ccm81 et merci,

quant tu dis "conséquence du codage des décimaux" ça me sonne très abstrait; car durant mes tests j´ai testé les décimales:

-exemple 1
0.666666666666667
0.333333333333333
-exemple 2
0.100000000000000
0.017600000000000
0.639200000000000
0.043200000000000
0.100000000000000
0.050000000000000
0.030000000000000
0.020000000000000

C’est 2 exemples fonctionnent, mais pas avec: 0.825, 0.1, 0.075; alors que dans l´exemple 1 il y a plus de décimale et dans l´exemple 2 il y a plus de valeur a compter...

J´ai testé ta fonction et oui cela fonctionne ce qui veut dire que la somme n´est pas exactement égale 1?...

Cdt,
0