2008-10-24 102 views
8

我有麻烦比较2双在Excel VBA双比较VBA精度问题

假设我有以下代码

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

b上的几个操作后,B现在等于0.6

但有关双数据类型不精确让我头疼,因为

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

你知道我怎样才能消除双重类型的尾随不精确?

回答

13

您无法比较浮点值是否相等。有关如何处理内在错误的讨论,请参阅本文“Comparing floating point numbers”。

它不像一个恒定的误差范围那么简单,除非你确切地知道浮动的绝对范围是什么。

+1

对于另一参考你可以检查出http://msdn.microsoft.com/en-us/ library/ae382yt8(VS.80).aspx – ZCHudson 2008-10-24 22:14:48

3

比较双等于平等是永远不明智的。

一些十进制值映射到几个浮点表示。所以一个0.6并不总是等于另一个0.6。

如果我们从另一个中减去一个,我们可能得到类似于0.00000000051的东西。

我们现在可以将相等定义为具有小于某个误差范围的差异。

1

正如已经指出的,很多十进制数不能精确地表示为传统的浮点类型。根据问题空间的性质,最好使用十进制VBA类型,该类型可以表示十进制数(基数为10),其精度可以达到某个小数点。这通常用于代表金钱,例如,通常需要2位小数精度。

Dim a as Decimal 
Dim b as Decimal 
a = 0.15 
b = 0.01 
+0

vba中有十进制数吗?我认为你需要声明为variant,然后通过Cdec(myVar)转换为十进制。 – 2008-10-25 16:26:47

1

货币数据类型可以是一个很好的选择。它以固定的四位数精度处理相对较大的数字。

3

,如果你要做到这一点....

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

您需要添加轮函数在IF语句是这样的...

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

参见here for additional Microsoft reference

2

下面是一个简单的功能,我写道:

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 

与调用它:

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)