【发布时间】:2012-07-06 21:17:48
【问题描述】:
这是一个简单的例子:
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”部分之后出现的 5 次数字 9 - “3.099999”)。
有趣的是,我使用单数据类型循环遍历某些内容的另一个函数显示了我们上面的双数据类型示例所存在的确切问题,而我们上面的单数据类型示例没有任何问题。所以,我在这里的真正原因是我的 Single Data Type 循环丢失并在使用“Step 0.1”时跳过了最后一项(递增 0.1)。
是否有可靠的方法使用“Step 0.1”和非整数数据类型来执行此操作?如果不是,我们是否知道这些混乱事物发生的规则(也就是说,混乱是可预测的)? 叹息
我以为你们都会觉得这很有趣,我当然很期待理解它。搜索谷歌是没用的,因为我一输入“for”和“step”的工作,就不断提出如何使用 step 运算符的示例,没有任何用处。
我很想知道如何忍受这种情况,或者安全地做到这一点,和/或首先为什么会发生这种情况。我宁愿不为这个特定的函数使用整数循环(然后使用另一个变量进行划分以获得我的十进制类型),但是如果我必须这样做并且没有可靠的方法可以做到这一点,我会的。但我把这个留给你们,我的程序员霸主。
我的示例发生在 VB6 中,但是,我也想知道在 VB.NET 甚至 C# 中是否也发生了同样的混乱?我假设它发生在 vba 和 vbscript 中。任何有关这方面的信息也会很有趣并受到赞赏。
提前谢谢你。
致版主(不是问题的必要阅读):这不是重复的帖子,可能有其他人用其他语言(例如 C#)发布浮点问题,但解决方案这个(VB6)问题不一定与C#问题的解决方案相同。可能有一些相同的解决方案,但也会有不同的解决方案,我无法从 C# 帖子中获得不同的解决方案/答案。事实证明,我感兴趣的解决方案是一个 VB6 特定的解决方案,在引用的 C# 帖子中找不到该解决方案。我敦促模组在尝试关闭帖子之前要勤奋,我看到帖子在很多场合被不公平地关闭,并且在一天结束时,你会进入一个没有增加任何价值的阶段,但从本网站的 Q 和 A 风格中删除了实质性价值。总之,如果一个类似的帖子甚至有可能提供新的信息/答案或解决方案,你最好不要关闭。特别是如果问题是针对不同语言的,即使概念相似或相同,也必然会有不同的解决方案和特定于语言的解决方案。
【问题讨论】:
-
stackoverflow.com/questions/11364996/… 的明确副本(从今天开始)
-
这是困扰许多新程序员的问题之一。这是一个带有图表的简单解释。 ;-)
-
@Erx_VB.NExT.Coder 您可能想阅读faq 以了解该站点的工作原理。您不熟悉浮点算术的最基本原理,这些原理与语言无关,适用于包括 VB6 在内的所有语言,这并不是您在上面大喊大叫的借口。请阅读上面 cmets 中提供的链接,请不要认为您在一个独特的问题中发布了关于其他人从未遇到过的独特问题的内容。事实上,它实际上是数百个完全相同的问题的重复。
标签: c# vb.net vba vb6 vbscript