当我调试我的VBA代码时,我遇到了这个奇怪的现象:
这个循环
Dim x,y as Double
x = 0.7
y = 0.1
For x = x - y To x + y Step y
Next x
只运行两次!
我尝试了许多此代码的变体来解决问题,这就是我想出的:
Double
将Decimal
转换为CDec()
- 帮助。Currency
数据类型而不是Double
- 有帮助。 所以我们这里有一个浮点舍入误差,发生在神秘的条件下。
我试图找出的是那些条件是什么,所以我们可以避免它们 谁将揭开这个谜团?
(原谅我的英语,它不是我的母语)。
答案 0 :(得分:0)
GD Falcon,
通常在解决For...Next
循环时,不建议使用“双”或“十进制”或“货币”变量,因为它们在准确性方面提供了一定程度的不确定性,这就是这种不准确程度。破坏你的代码作为实际的停止参数(当xy,加上(nxy)= x + y)时,就绝对值而言,是一个无法解决的等式,除非你限制它使用的小数位数。
在For...Next
循环中使用整数(或长)变量通常被认为是更好的做法,因为它们的结果更加确定。
另见下文帖子:
How to make For loop work with non integers
如果你想让它成功运行并迭代3次(正如我所期望的那样)
尝试如下:
Dim x, y As Double
x = 0.7
y = 0.1
For x = Round(x - y, 1) To Round(x + y, 1) Step Round(y, 1)
Debug.Print x
Next x
同样,最好不要以这种特殊的方式使用双打,但如果必须,你必须限制他们计算的小数位数或设置一个更模糊的终点(即x > y
,而不是x = y
)
您使用的编码意味着您希望针对容差级别y测试某个值x。 假设这是正确的,它意味着测试3次;
test_1: x = x - y
test_2: x = x
test_3: x = x + y
下面的代码会做同样的事情,但它会有更好的定义范围。
Dim i As Integer
Dim x, y, w As Double
x = 0.7
y = 0.1
For i = -1 To 1 Step 1
w = x + (i * y)
Debug.Print w
Next i
祝你好运!