Précédent   Forum du club des développeurs et IT Pro > Autres langages > Général Visual Basic 6 et VBScript > VB 6 et antérieur
VB 6 et antérieur Visual basic 6 et versions antérieures. Avant de poster -> La FAQ VB6, Les tutoriels VB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/11/2012, 10h03   #1
iclic
Membre éprouvé
 
Inscription : décembre 2007
Messages : 454
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 454
Points : 497
Points : 497
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.
iclic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 10h54   #2
sevyc64
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 5 297
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 40
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 5 297
Points : 11 975
Points : 11 975
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
sevyc64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 15h33   #3
iclic
Membre éprouvé
 
Inscription : décembre 2007
Messages : 454
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 454
Points : 497
Points : 497
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 ...
iclic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2012, 23h14   #4
DarkVader
Rédacteur
 
Avatar de DarkVader
 
Homme
Développeur informatique
Inscription : mai 2002
Messages : 1 945
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 : 1 945
Points : 2 731
Points : 2 731
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 :
Citation:
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 »
DarkVader est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/11/2012, 09h18   #5
iclic
Membre éprouvé
 
Inscription : décembre 2007
Messages : 454
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 454
Points : 497
Points : 497
Bonjour,
Citation:
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
iclic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h56.


 
 
 
 
Partenaires

Hébergement Web