我有麻烦比较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
你知道我怎样才能消除双重类型的尾随不精确?
我有麻烦比较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
你知道我怎样才能消除双重类型的尾随不精确?
您无法比较浮点值是否相等。有关如何处理内在错误的讨论,请参阅本文“Comparing floating point numbers”。
它不像一个恒定的误差范围那么简单,除非你确切地知道浮动的绝对范围是什么。
比较双等于平等是永远不明智的。
一些十进制值映射到几个浮点表示。所以一个0.6并不总是等于另一个0.6。
如果我们从另一个中减去一个,我们可能得到类似于0.00000000051的东西。
我们现在可以将相等定义为具有小于某个误差范围的差异。
正如已经指出的,很多十进制数不能精确地表示为传统的浮点类型。根据问题空间的性质,最好使用十进制VBA类型,该类型可以表示十进制数(基数为10),其精度可以达到某个小数点。这通常用于代表金钱,例如,通常需要2位小数精度。
Dim a as Decimal
Dim b as Decimal
a = 0.15
b = 0.01
vba中有十进制数吗?我认为你需要声明为variant,然后通过Cdec(myVar)转换为十进制。 – 2008-10-25 16:26:47
货币数据类型可以是一个很好的选择。它以固定的四位数精度处理相对较大的数字。
,如果你要做到这一点....
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
下面是一个简单的功能,我写道:
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)
对于另一参考你可以检查出http://msdn.microsoft.com/en-us/ library/ae382yt8(VS.80).aspx – ZCHudson 2008-10-24 22:14:48