对于循环跳过最后迭代VB(困惑)代码包含,测试,仍然不工作

时间:2012-07-06 21:17:49

标签: c# vb.net vba vb6 vbscript

这是一个简单的例子:

Dim si As Single
For si = 2.6 To 3.3 Step 0.1
  MsgBox si
Next si

我得到的数字如下(它们显示在MsgBox中,如下所示):

2.6
2.7
2.8
2.9
3
3.099999
3.199999
3.299999

所以,我想我会将数据类型从Single更改为Double以查看会发生什么。这次,没有.099999类型编号,但跳过了最后一项(迭代),如,缺失,并且不存在。以下是它们出现在MsgBox显示中的结果:

2.6
2.7
2.8
2.9
3
3.1
3.2

我猜测在最后一次迭代失踪的情况下,它会像.299999一样跟踪它,并且从未在自己的脑海中达到.3,所以跳过它?但是,问题在于,如果发生了这种情况,您将获得前一次迭代之一,以便能够发生这种情况,就像在单数据类型示例中所做的那样,如果您在此之后截断了所有内容,那么第一个小数,你会注意到3.0出现了两次。首先是“3”然后是“3.0”(如果我们忽略/截断“3.0”部分之后的数字9的5次出现 - “3.099999”)。

有趣的是,我使用单数据类型循环访问某些内容的另一个函数显示了上面我们的双数据类型示例所具有的确切问题,并且上面的单数据类型示例没有出现任何问题。因此,我在这里的真正原因是我的单数据类型循环丢失并在使用“步骤0.1”时跳过最后一项(增加0.1)。

使用“Step 0.1”和非整数数据类型有可靠的方法吗?如果没有,我们是否知道这些混乱事件发生的规则(在那里,混乱是可预测的)? 叹息

我以为你们都觉得这很有趣,我很期待明白这一点。搜索Google是没用的,因为我一进入“for”和“step”工作,就不断提出如何使用step运算符的示例,没有任何用处。

我很想知道如何忍受这个,或者安全地做到这一点,和/或为什么一开始就这样做。我宁愿不使用Integers为这个特定的函数循环(然后使用另一个变量除以得到我的小数类型),但是如果我必须并且没有可靠的方法来做,否则,我会。但是我把这个留给你们,我的程序员是霸主。

我的例子发生在VB6中,但是,我也想知道在VB.NET甚至C#中是否会发生同样的混乱?我假设它发生在vba和vbscript中。任何关于此的信息也会很有趣并且很受欢迎。

提前谢谢。

致主持人(没有必要阅读问题):这不是重复的帖子,可能有其他人发布其他语言的浮点问题(如C#)但解决方案对此(VB6)问题不一定与C#问题的解决方案相同。可能有一些解决方案是相同的,但也会有不同的解决方案,我无法从C#帖子中获得不同的解决方案/答案。事实证明,我感兴趣的解决方案是一个VB6特定的解决方案,在引用的C#帖子上找不到。我敦促mods在尝试关闭帖子之前勤奋,我看到帖子在许多场合不公平地关闭,并且在一天结束时,你进入了一个你没有添加任何价值的阶段,但从本网站的Q和A风格中删除了实质性的价值。总而言之,如果甚至有可能通过类似的帖子获得新的信息/答案或解决方案,那么最好避免关闭。特别是如果问题是针对不同的语言,即使概念相似或相同,也必然会有不同的语言特定的解决方案和解决方案。

3 个答案:

答案 0 :(得分:7)

问题归结为浮点数如何在内存中表示。其他许多人已经发布了关于如何表示浮点数的好参考的链接。

当您尝试使用double而不是单个时,数字会按如下方式递增 - 必须单步执行调试器以获取值ToString不会输出值的完整精度。

2.6
2.7
2.8000000000000003
2.9000000000000004
3.0000000000000004
3.1000000000000005
3.2000000000000006
3.3000000000000007

正如您所看到的,最终值略大于for循环的结束,因此它被跳过。

通过使用整数,您可以避免for循环中的浮点问题,但是您需要在每次迭代时将数字除以10以获得要打印的值。

Dim i As Integer
For i = 26 To 33 Step 1
        MsgBox(i / 10)
Next

答案 1 :(得分:3)

尝试使用小数代替精度:

For i As Decimal = 2.6 To 3.3 Step 0.1
  MessageBox.Show(i.ToString)
Next

如果使用VB6,您可以尝试使用Currency类型(如JeffSiver所说):

Dim i As Currency
For i = 2.6 To 3.3 Step 0.1
  MsgBox i
Next

答案 2 :(得分:2)

我将乘以10并使用整数作为循环。即使使用decimal,我认为您可以处理相同类型的问题