Probleme de somme boucle...

Résolu
GermPeru Messages postés 175 Statut Membre -  
yg_be Messages postés 23437 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

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
    1. GermPeru Messages postés 175 Statut Membre
       
      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
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > GermPeru Messages postés 175 Statut Membre
       
      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
    3. GermPeru Messages postés 175 Statut Membre
       
      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
    4. GermPeru Messages postés 175 Statut Membre
       
      Ils ont mis ou le bouton "Résolu"?
      0
    5. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > GermPeru Messages postés 175 Statut Membre
       
      désolé, aucune idée
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    1. GermPeru Messages postés 175 Statut Membre
       
      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