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?
6 réponses
Vous ne pouvez pas comparer les valeurs à virgule flottante pour l'égalité. Voir cet article sur"Comparer des nombres à virgule flottante
ce n'est pas aussi simple que de comparer à une marge d'erreur constante à moins que vous sachiez avec certitude quelle est la portée absolue des flotteurs à l'avance.
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.
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)
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.
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
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.