以下代码很简单,并按预期输出
CODE:
Option Explicit
Sub Test_loop2()
Dim i As Long
For i = -3 To 3 Step 1
Debug.Print i
Next i
End Sub
输出:
由于四舍五入,以下代码提前退出
Option Explicit
Sub Test_loop2()
Dim i As Double
For i = -0.3 To 0.3 Step 0.1
Debug.Print i
Next i
End Sub
输出:
在保留For Loop
以确保最后一个值在非整数循环中运行时,我可以使用哪种最可靠的方法?
例如,对于i = X到Y步骤Z - 如果它是Z的倍数,则必须始终达到Y
对于i = 0至0.3步骤0.1,则0.3将处于循环
对于i = 0到0.3步骤0.2,则0.3将不在循环中
答案 0 :(得分:4)
Floating point arithmetic最终会让你失望。
对于柜台,坚持整数。然后从该计数器派生浮点值。例如:
Dim i As Long
Dim d As Double
For i = 0 To 6
d = (i - 3) * 0.1 ' or whatever formula needed
Debug.Print d
Next i
答案 1 :(得分:1)
Double as循环限制和计数器的另一个选项
Sub dTest()
Dim i As Double
For i = -0.31 To 0.31 Step 0.1
Debug.Print Round(i, 1)
Next
End Sub
结果:
-0.3
-0.2
-0.1
0
0.1
0.2
0.3
答案 2 :(得分:0)
看起来像使用十进制而不是双重工作
Sub Test_loop2()
Dim i As Variant
Dim ffrom As Variant
Dim fto As Variant
Dim fInc As Variant
ffrom = CDec(-0.3)
fto = CDec(0.3)
fInc = CDec(0.1)
For i = ffrom To fto Step fInc
Debug.Print i
Next i
End Sub
答案 3 :(得分:0)
GD,
在循环中使用Double(或Float)值的问题是它们都是值的近似值。
让循环结束遇到绝对值,例如:
For i=1 to 5
要求i正好为5才能使循环正常工作,但double数据类型可以是4.999999999到5.000000001(例如)中的任何内容,它们随后将不满足For To循环的= 5要求。你可能会选择
Do
'do some code here
Loop Until i>5
其中阈值变得更加模糊,这对于float或double数据类型是理想的。
正常情况下,根据@ Jean-FrançoisCorbett的回答,在计数器和步骤值中仅使用“整数”或“长”数据类型并使用公式来调整代码所需的计数/计算方法变量
答案 4 :(得分:0)
我只是将0.00001的常量添加到上限,以避免出现上述浮点不准确的问题,例如:
For s = 12 To 19.5 + 0.00001 Step 0.1
代码显示最初突出显示问题的样本值,但除常量0.00001外,这些可能是变量。如果您的增量可能小于0.00001,则可能需要对此进行微调。
答案 5 :(得分:-1)
我发现最快的解决方案可能就是使用Round操作数。
Sub Test_loop2()
Dim i As Double
For i = -0.3 To 0.3 Step 0.1
Debug.Print Round(i, 1)
Next i
End Sub