Comparer le double dans le problème de précision VBA

j'ai du mal à comparer 2 doubles en Excel VBA

supposons que j'ai le code suivant

Dim a as double
Dim b as double
a = 0.15
b = 0.01

Après quelques manipulations sur b, b est égale à 0,6

cependant l'imprécision liée au double type de données me donne mal à la tête parce que

if a = b then
 //this will never trigger
end if

savez-vous comment je peux enlever l'imprécision arrière sur le type double?

10
demandé sur Eric 2008-10-25 02:05:55

6 réponses

si vous vous apprêtez à faire....

Dim a as double  
 Dim b as double  
 a = 0.15  
 b = 0.01

vous devez ajouter la fonction ronde dans votre instruction IF comme celle-ci...

  If Round(a,2) = Round(b,2) Then   
     //code inside block will now trigger.
  End If  

Voir aussi ici pour la référence supplémentaire de Microsoft.

5
répondu Anonymous Type 2011-04-07 06:14:21
Function dblCheckTheSame(number1 As Double, number2 As Double, Optional Digits As Integer = 12) As Boolean

If (number1 - number2) ^ 2 < (10 ^ -Digits) ^ 2 Then
    dblCheckTheSame = True
Else
    dblCheckTheSame = False
End If

End Function

avec:

MsgBox dblCheckTheSame(1.2345, 1.23456789)
MsgBox dblCheckTheSame(1.2345, 1.23456789, 4)
MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002)
MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002, 14)
5
répondu user3706920 2014-06-04 15:14:25

Il n'est jamais sage de comparer doubles sur l'égalité.

certaines valeurs décimales correspondent à plusieurs représentations en virgule flottante. Si l'un de 0,6 n'est pas toujours égale à 0,6.

si nous soustrayons l'un de l'autre, nous obtenons probablement quelque chose comme 0.00000000051.

Nous pouvons maintenant définir l'égalité comme ayant une différence plus petite qu'une certaine marge d'erreur.

3
répondu Toon Krijthe 2008-10-24 22:09:40

comme il a été souligné, de nombreux nombres décimaux ne peuvent pas être représentés précisément comme des types traditionnels à virgule flottante. Selon la nature de votre espace de problème, vous pouvez être mieux en utilisant le type décimal VBA qui peut représenter des nombres décimaux (base 10) avec une précision parfaite jusqu'à un certain point décimal. Cela est souvent fait pour représenter l'argent par exemple où la précision décimale à deux chiffres est souvent souhaitée.

Dim a as Decimal
Dim b as Decimal
a = 0.15
b = 0.01
2
répondu C. Dragon 76 2008-10-24 23:18:39

le type de données devise peut être une bonne alternative. Il traite des nombres relativement grands avec une précision fixe de quatre chiffres.

1
répondu DJ. 2008-10-27 21:36:58