Type de donnée ERREUR énorme!

Type de donnée ERREUR énorme! - VB/VBA/VBS - Programmation

Marsh Posté le 16-11-2005 à 12:00:34    

Boujour à tous,  
 
Savez vous que pour VBA 7.6-7.4 = 0.199999999999999 lorsque l'on ne définit pas le type de donnnée de notre variable (par défaut elle est définit pas VBA en tant que "Variant" ).  
 
Je trouve cela très dérangeant, et ce qui est encore plus dérangeant, c'est que le résultat différe, pour le type de données "single" selon que l'on affiche le résultat dans une cellule ou dans un msgbox.  
 
Quelqu'un pourrait-il m'éclairer sur cette ERREUR qui fausse beaucoup de résultats?  
 
Voici un code qui permet de vérifier le résultat de "monnombre=7.6-7.4" en fonction du type de donnée et qui affiche 2 résultats: un dans excel et un dans un msgbox:  
 
Code:  
 Sub type_donnée()
 
Dim i, j
Dim MyInteger As Integer
Dim MyLong As Long
Dim MySingle As Single
Dim MyDouble As Double
Dim MyVariant As Variant
Dim MyCurrency As Currency
 
MyInteger = 7.6 - 7.4
MyLong = 7.6 - 7.4
MySingle = 7.6 - 7.4
MyDouble = 7.6 - 7.4
MyVariant = 7.6 - 7.4
MyCurrency = 7.6 - 7.4
 
j = 1
Cells(1, j).Value = "Type de donnée"
Cells(2, j).Value = "Integer"
Cells(3, j).Value = "Long"
Cells(4, j).Value = "Single"
Cells(5, j).Value = "Double"
Cells(6, j).Value = "Variant"
Cells(7, j).Value = "Currency"
 
j = 2
Cells(1, j).Value = "Résultat de 7.6-7.4"
Cells(2, j).Value = MyInteger
Cells(3, j).Value = MyLong
Cells(4, j).Value = MySingle
Cells(5, j).Value = MyDouble
Cells(6, j).Value = MyVariant
Cells(7, j).Value = MyCurrency
 
Range("B2:B7" ).Select
    Range("B7" ).Activate
    Selection.NumberFormat = "0.000000000000000"
 
 
MsgBox "Voici le résultat de  ""monnombre = 7.6-7.4"" en  fonction du type de donnée déclaré:" _
& Chr(10) & Chr(10) & _
"Interger:" & Chr(9) & Chr(9) & MyInteger & Chr(10) & _
"Long: " & Chr(9) & Chr(9) & MyLong & Chr(10) & _
"Single: " & Chr(9) & Chr(9) & MySingle & Chr(10) & _
"Double: " & Chr(9) & Chr(9) & MyDouble & Chr(10) & _
"Variant: " & Chr(9) & Chr(9) & MyVariant & Chr(10) & _
"Currency: " & Chr(9) & MyCurrency & Chr(10)
 
 
End Sub
 
 
 
Merci d'avance.  
 
A+

Reply

Marsh Posté le 16-11-2005 à 12:00:34   

Reply

Marsh Posté le 16-11-2005 à 14:32:13    

j'ai connu cette erreur lors d'un projet de fin d'études asp/vbs. Je crois que ça vient de la représentation en mémoire des nombres et des casts fait par l'interpréteur VB. En faisant une recherche, j'avais même trouvé un exe écrit par un gars qui montrait ce bug et que expliquait le pourquoi du comment, et surtout, comment contourner le pb. Mais je ne n'ai plus le lien, désolé :(...

Reply

Marsh Posté le 16-11-2005 à 16:05:11    

Salut à tous,
 
J'ai trouvé d'ou vient le pb, en fait cela ne vient pas de VBA mais du PC et de ses soft en général. C'est due  la méthode de calcul, c'est un peu dur à expliquer donc voici un lien:  
 
 
http://support.microsoft.com/defau [...] n-us;42980
 
J'espère que cela pourra aider du monde. ;)  
 
 
 
A+


Message édité par jerome-gmc le 17-11-2005 à 09:23:03
Reply

Marsh Posté le 16-11-2005 à 16:23:00    

un autre lien qui explique les erreurs d'arrondi sur les float:
http://blogs.msdn.com/ericlippert/ [...] 53000.aspx


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 16-11-2005 à 20:50:18    

bonsoir,  
on corrige la plupart du temps ce problème avec :
Outils / Options / Calculs + Cocher Calcul avec la précision....
A+


---------------
roger
Reply

Marsh Posté le 17-11-2005 à 09:32:22    

Salut à tous,
 
Galopin l'option dont tu parles n'est pas liée avec le problème d'arondi que peuvent générer les soft mais c'est juste un astuce d'excel pour gérer les options d'affichage et qui est très dangereuse à utiliser pour les novices.
 
A quoi sert cette option, un exemple:
si tu mets les cellules A1, A2 et A3 au format de cellule "nombre" avec un chiffre derrière la virgule, et que tu écris dans ces 3 cellules la formule "=1/3", tu obtiens pour chaque cellule "0.3".
Si maintenant tu fais la somme de ces 3 cellules dans la cellule A4: "=A1+A2+A3", tu obtiens:
 
Sans l'option: 1    car 1/3 + 1/3 + 1/3 = 1
Avec l'option: 0.9 car 0.3 +0.3 +0.3 = 0.9
 
 
Perso, je te tiens à mettre en garde quant à l'utilisation de cette option
 
 
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed