如何使循环使用非整数

时间:2015-04-10 09:47:50

标签: vba

以下代码很简单,并按预期输出

CODE:

Option Explicit

Sub Test_loop2()
Dim i As Long
  For i = -3 To 3 Step 1
    Debug.Print i
  Next i
End Sub

输出:

enter image description here

由于四舍五入,以下代码提前退出

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

输出:

enter image description here

在保留For Loop以确保最后一个值在非整数循环中运行时,我可以使用哪种最可靠的方法?

例如,对于i = X到Y步骤Z - 如果它是Z的倍数,则必须始终达到Y

对于i = 0至0.3步骤0.1,则0.3将处于循环

对于i = 0到0.3步骤0.2,则0.3将不在循环中

6 个答案:

答案 0 :(得分:4)

如果你使用Double(或Single)作为计数器,

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