Erx*_*der -4 c# vb.net vb6 vbscript vba
这是一个简单的例子:
Dim si As Single
For si = 2.6 To 3.3 Step 0.1
MsgBox si
Next si
Run Code Online (Sandbox Code Playgroud)
我得到的数字如下(它们显示在MsgBox中,如下所示):
2.6
2.7
2.8
2.9
3
3.099999
3.199999
3.299999
Run Code Online (Sandbox Code Playgroud)
所以,我想我会将数据类型从Single更改为Double以查看会发生什么.这次,没有.099999类型编号,但跳过了最后一项(迭代),如,缺失,并且不存在.以下是它们出现在MsgBox显示中的结果:
2.6
2.7
2.8
2.9
3
3.1
3.2
Run Code Online (Sandbox Code Playgroud)
我猜测在最后一次迭代失踪的情况下,它会像.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中删除了大量的价值和这个网站的风格.总而言之,如果甚至有可能通过类似的帖子获得新的信息/答案或解决方案,那么最好避免关闭.特别是如果问题是针对不同的语言,即使概念相似或相同,也必然会有不同的语言特定的解决方案和解决方案.
问题归结为浮点数如何在内存中表示.其他许多人已经发布了关于理解浮点数如何表示的良好参考的链接.
当您尝试使用双,而不是单一的增加如下的数字-有一个调试器分步获得该值ToString不会输出值的完整精度.
2.6
2.7
2.8000000000000003
2.9000000000000004
3.0000000000000004
3.1000000000000005
3.2000000000000006
3.3000000000000007
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,最终值略大于for循环的结束,因此它被跳过.
通过使用一个整数,而不是你能避免浮点问题上你的for循环,但你需要通过10在每次迭代划分数得到你想要打印的值.
Dim i As Integer
For i = 26 To 33 Step 1
MsgBox(i / 10)
Next
Run Code Online (Sandbox Code Playgroud)