我正在尝试建立一个从双类型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