何时发生浮点舍入错误?

时间:2015-11-16 04:47:10

标签: vba for-loop floating-point rounding-error

当我调试我的VBA代码时,我遇到了这个奇怪的现象:
这个循环

Dim x,y as Double  
x = 0.7  
y = 0.1  
For x = x - y To x + y Step y
Next x

只运行两次!

我尝试了许多此代码的变体来解决问题,这就是我想出的:

  • 用简单的数字(0.6到0.8)替换循环边界 - 帮助。
  • 用数字替换变量(所有组合) - 没有帮助。
  • 使用do while / until循环替换for循环 - 帮助。
  • 替换x和y的值(y = 0.01,0.3,0.4,0.5,0.7,0.8,0.9-帮助.0.2,0.6 -didn' t帮助.x = 1,2,3帮助.x = 4,5,6,7,8,9 - 没有帮助。
  • 使用DoubleDecimal转换为CDec() - 帮助。
  • 使用Currency数据类型而不是Double - 有帮助。

所以我们这里有一个浮点舍入误差,发生在神秘的条件下。

我试图找出的是那些条件是什么,所以我们可以避免它们 谁将揭开这个谜团?

(原谅我的英语,它不是我的母语)。

1 个答案:

答案 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
祝你好运!