+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Discussion: une énigme de VB6?

  1. #1
    Membre expérimenté
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 564
    Points
    564

    Par défaut une énigme de VB6?

    Bonjour,

    Qui peut m'expliquer cette bizarrerie de VB?
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Private Sub Form_Load()
     
    Dim var1 As Single
    Dim var2 As Single
    Dim var3 As Single
     
    var2 = 0.21
    var3 = 21
    var1 = var3 / 100
     
    Debug.Print var1, var2
    If var1 = var2 Then
      Debug.Print "je passe dans la condition"
                   Else
      Debug.Print "je ne passe pas dans la condition"
    End If
    Stop
    End Sub
    Bien sûr la valeur de la variable 1 est identique à la variable 2,
    et je passe par le if, mais si j'ajoute une décimale
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Private Sub Form_Load()
     
    Dim var1 As Single
    Dim var2 As Single
    Dim var3 As Single
     
    var2 = 0.211
    var3 = 21.1
    var1 = var3 / 100
     
    Debug.Print var1, var2
    If var1 = var2 Then
      Debug.Print "je passe dans la condition"
                   Else
      Debug.Print "je ne passe pas dans la condition"
    End If
    Stop
    End Sub
    Les valeurs des deux variables sont identiques,
    mais je ne passe pas par le if, idem si les variables sont de type variant ou double.

    Par contre si je les définis comme ceci

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Private Sub Form_Load()
     
    Dim var1 As Currency
    Dim var2 As Currency
    Dim var3 As Currency
    var2 = 0.211
    var3 = 21.1
    var1 = var3 / 100
     
    Debug.Print var1, var2
    If var1 = var2 Then
      Debug.Print "je passe dans la condition"
                   Else
      Debug.Print "je ne passe pas dans la condition"
    End If
    Stop
    End Sub
    Là , je passe bien par le if sans problème.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    7 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : janvier 2007
    Messages : 7 096
    Points : 17 832
    Points
    17 832

    Par défaut

    Parce que les nombre à virgule flottante (Single et Double pour VB) de part leur constitution même ne sont pas des nombres à représentation exacte. Tous les nombres réels imaginable ne sont pas forcément représentable en flottant.
    Un nombre non représentable est représenté par le nombre représentable le plus proche.

    Ainsi il possible que 0.211 ne soit pas représentable, il serait alors représenté par 0.2109999999999999999999999...... ou par 2.11111111111111111111111111...
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre expérimenté
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 564
    Points
    564

    Par défaut

    Merci pour la réponse... donc se méfier des comparaisons de nombres ...
    ou alors faire et là ça fonctionne

    Code :
    1
    2
    3
     
     
    If Str(var1) = Str(var2) Then ...

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2002
    Messages : 2 034
    Points : 2 796
    Points
    2 796

    Par défaut

    Bonsoir,
    la comparaison de String est dangereuse ("5.1"<>"5.10")

    En dehors des valeurs décimales de type Currency
    il est aussi possible d'utiliser les Decimaux
    qui sont les plus grands nombres utilisables sous VB
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Dim var1 As Variant
        Dim var2 As Variant
        Dim var3 As Variant
     
        var2 = CDec(1 / 3)
        var3 = CDec(100 / 3)
        var1 = CDec(var3 / 100)
     
        Debug.Assert var1 = var2
    retourne Vrai

    Rappel de la MSDN :
    Si une valeur de type Currency est comparée à une valeur de type Single ou Double, cette dernière est convertie en valeur de type Currency. De même, lorsqu'une valeur de type Decimal est comparée à une valeur de type Single ou Double, cette dernière est convertie en valeur de type Decimal.

    Avec les valeurs de type Currency, les parties décimales inférieures à 0,0001 peuvent être perdues ; avec celles de type Decimal, les parties décimales inférieures à 1E-28 peuvent être perdues ou un dépassement de capacité peut se produire. Deux valeurs comparées peuvent alors paraître équivalentes sans toutefois l'être réellement.
    De plus l'option de compilation avancée :
    Autoriser les opérations en virgule flottante non arrondies
    est aussi à prendre en compte.

    Je fournis pelles et pioches mais jamais l'huile de coude.
    ________________________________________________

    « Heureux soient les fêlés, car ils laisseront passer la lumière. »

    Pensez aux liens
    Rechercher - Google - Google Labs - AllApi
    et avant de poster : « A lire » , « Tutoriel sur le déboguage »

  5. #5
    Membre expérimenté
    Inscrit en
    décembre 2007
    Messages
    471
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 471
    Points : 564
    Points
    564

    Par défaut

    Bonjour,
    De DarkVader

    la comparaison de String est dangereuse ("5.1"<>"5.10")
    Oui mais... VB enlève automatiquement les zéros inutiles,

    donc 5.10 devient 5.1

    De même 00005.1000 devient 5.1

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •