IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

une énigme de VB6?


Sujet :

VB 6 et antérieur

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut une énigme de VB6?
    Bonjour,

    Qui peut m'expliquer cette bizarrerie de VB?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    10 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 191
    Points : 28 070
    Points
    28 070
    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 éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Merci pour la réponse... donc se méfier des comparaisons de nombres ...
    ou alors faire et là ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 130
    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 130
    Points : 3 118
    Points
    3 118
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    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

Discussions similaires

  1. ajouter une table avec vb6
    Par thunderpat dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 13/06/2007, 10h54
  2. Changer de Look&Feel pour une appli en VB6
    Par poissonsoluble dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 12/04/2007, 23h28
  3. realiser une application en vb6.0
    Par mimosa803 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/02/2007, 03h05
  4. Firefox : une énigme ?
    Par Attilius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 09/08/2006, 17h27
  5. Coloriez l'onglet d'une SSTab dans Vb6
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/01/2006, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo