VBA做双变量循环



我正在尝试建立一个从双类型x到双类型y的列表,增量为0.001。

dblx = .093
dbly = .103
do while dblx <= dbly
"INSERT STATEMENT for dblx"
dblx = dblx + .001
loop

现在这个工作直到我得到。102。

= .102最后一次迭代从未发生。

我疯了吗?我知道。103 <=。103!但出于某种原因Access没有?起初我认为它可能是变量类型,它们都是双精度。我已经完成了,将读取值更改为硬设置值,尝试不同范围的值…同样,任何小于。102的值都不会产生问题,但只要我的"锚值"(最大阈值)大于或等于0.102,则do循环的最后一次迭代永远不起作用

答案是使用十进制类型,这有点尴尬,因为必须声明为变体,然后使用cdec赋值。

Sub TestDecimal()
Dim dblx As Variant
Dim dbly As Variant
dblx = CDec(0.093)
dbly = CDec(0.103)

Do While dblx <= dbly
Debug.Print dblx
dblx = dblx + cdec(0.001)
Loop

End Sub

输出
0.093 
0.094 
0.095 
0.096 
0.097 
0.098 
0.099 
0.1 
0.101 
0.102 
0.103

浮点运算不精确。例如,你可能得到0.103000000001213而不是0.103。因此,在测试的最终值

上添加一个小值(epsilon)
Sub Test()
Const Eps = 0.00000001
Dim dblx As Double, dbly As Double

dblx = 0.093
dbly = 0.103

Do While dblx <= dbly + Eps
Debug.Print dblx, dbly
dblx = dblx + 0.001
Loop
End Sub

在这一点上我会相信你的直觉,但仍然要记住,计算机只是在做你让它做的事情。

如果我赌这个问题,无论在&;INSERT STATEMENT for dblx&;正在导致您错过最后的增量。

为了进行完整性检查,我继续测试代码:
Sub check_double()
Dim dblx As Double
Dim dbly As Double

dblx = 0.093
dbly = 0.103

Do While dblx <= dbly
dblx = dblx + 0.001
Debug.Print dblx
Loop
End Sub

输出为:

0.094 
0.095 
0.096 
0.097 
0.098 
0.099 
0.1 
0.101 
0.102 
0.103 

如果您有四位或更少的小数,请使用Currency来执行此类任务,以避免浮点错误:

Public Function LoopTest()
Dim dblx    As Currency
Dim dbly    As Currency

dblx = 0.093
dbly = 0.103

Do While dblx <= dbly
' "INSERT STATEMENT for dblx"
dblx = dblx + 0.001
Debug.Print dblx
Loop
End Function

输出:

0.094 
0.095 
0.096 
0.097 
0.098 
0.099 
0.1 
0.101 
0.102 
0.103 
0.104

相关内容

  • 没有找到相关文章

最新更新