关于vb 中 for next语句中循环变量与step的问题

n = 0
For i = 0 To 1 Step 0.1
n = n + 1
Next

n = 0
For i = 0 To 0.1 Step 0.01
n = n + 1
Next
有什么区别,为什么前者n的值为10,后者n的值为11
Dim i As Single
Dim n As Integer
当i 是 single的时候就有区别
当i 是 double的时候就没有区别
我试验过了结果跟step后数字的类型也有关系,结论是:double没有问题,single就有可能有问题
single精度就这么低吗,怎么练0.1的精确度都达不到啊?
三楼,
我怎么看不出来0.1超出single的范围了啊。。。
最新回答
凉城无爱

2024-10-16 08:50:34

哦,这个结果我已经运行过了!
都是11!没什么区别!
从0-1,每次增加0.1,循环11次。所以累加后和为11
从0-0.1,每次增加0.01,循环11次,所以累加后和也为11
没什么区别!!!
下面是我运行的代码
Private Sub Command1_Click()
n = 0
For i = 0 To 0.1 Step 0.01
n = n + 1
Next
Print "n=" & n
k = 0
For j = 0 To 0.1 Step 0.01
k = k + 1
Next
Print "k=" & k
End Sub
刚才又把i的变量定义为整型,单精度,双精度。分别实验了一下,用msgbox尝试输出了每次循环中i与n的结果,发现当单精度的时候,i=0.1,....0.7,0.800001,0.90001,所以导致最后结果就变成10次了!
因此怀疑是单精度的时候,在0.7+0.1的过程中,导致结果运算出错。就导致后面一系列的错误了。。
如果你还想查具体原因,参照单精度的范围,自己再仔细研究了。
年少总有梦

2024-10-16 14:19:35

这是“精度”的问题,

这个 For i = 0 To 0.1 Step 0.01 的i值远远超过了Single的范围,先看看Single与double的区别你就会明白为什么:

Single(单精度浮点型)变量存储为 IEEE 32 位(4 个字节)浮点数值的形式,
它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,
而在正数的时候是从 1.401298E-45 到 3.402823E38。Single 的类型声明字符为感叹号 (!)。

Double(双精度浮点型)变量存储为 IEEE 64 位(8 个字节)浮点数值的形式,
它的范围在负数的时候是从 -1.79769313486232E308 到 -4.94065645841247E-324,
而正数的时候是从 4.94065645841247E-324 到 1.79769313486232E308。Double 的类型声明字符是数字符号 (#)。
陌上初安

2024-10-16 09:36:34

single 为单精度浮点型,由于你用的是小数,在内存计数器中0.01和0.1的差别不只是10倍的关系,具体你可以再百科中看一下他们在内存中的储存数是多少,所以你如果用SINGLE 类型的话就不可以用小数来区别这两种算法,如果想用小数区分的话推荐你用其他类型