Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 1728|回复: 6

[已解决]为何两段代码处理差异

[复制链接]
发表于 2012-5-3 17:43 | 显示全部楼层 |阅读模式
本帖最后由 隐身 于 2012-5-3 21:39 编辑


Sub 代码一()

For i = 1.13 To 1.1 Step -0.01
'求1.13到1.10的所有数据之和、平均值,步长为0.01,例如1.13+1.12+1.11+1.10就为总和,平均值为总和/个数=4.46/4=1.115


    fu = fu + i
    j = j + 1
Next
MsgBox fu + i
MsgBox j + 1
MsgBox "平均" & (fu + i) / (j + 1)
End Sub



Sub 代码二()
'求1.110到1.108之间数据的总和、平均值,步长为0.001,总和=1.110+1.109+1.108=3.327,平均值为3.327/3=1.109


For i = 1.11 To 1.108 Step -0.001
    fu = fu + i
    j = j + 1
Next
MsgBox fu
MsgBox j
MsgBox "平均" & fu/ j
End Sub

两段代码的目的相同、类似,但是要求得正确结果,代码2得修改后面的求和、平均值计算式子,

代码1的平均值式子为 (fu + i) / (j + 1)

代码2的平均值式子为  fu/j

为何两段代码不能用同样的式子求准确结果。


最佳答案
2012-5-4 09:36
本帖最后由 wayy 于 2012-5-4 09:38 编辑

  1. Sub 代码一()
  2. For x = 1.13 To 1.1 Step -0.01
  3. '求1.13到1.10的所有数据之和、平均值,步长为0.01,例如1.13+1.12+1.11+1.10就为总和,平均值为总和/个数=4.46/4=1.115
  4.   fu = fu + x
  5.   j = j + 1
  6.   x = Round(x, 2)
  7. Next
  8. MsgBox fu
  9. MsgBox j
  10. MsgBox "平均" & fu / j
  11. End Sub
复制代码
其实代码2是正确的,代码1是因为小数点的原因导致的不能进行最后一次循环,加一行代码  x = Round(x, 2) 就可以了。
发表于 2012-5-3 18:09 | 显示全部楼层
为何两段代码得分表修改结果才是正确的呢?

这句子是不是有错字,不明白{:031:}
回复

使用道具 举报

 楼主| 发表于 2012-5-3 19:03 | 显示全部楼层
Select 发表于 2012-5-3 18:09
为何两段代码得分表修改结果才是正确的呢?

这句子是不是有错字,不明白

这两段代码的作用是分别按指定步长求数据区间的总和、平均值
回复

使用道具 举报

发表于 2012-5-3 19:08 | 显示全部楼层
你说的话是什么意思,没怎么看明白
回复

使用道具 举报

 楼主| 发表于 2012-5-3 21:39 | 显示全部楼层
飞天小猪 发表于 2012-5-3 19:08
你说的话是什么意思,没怎么看明白

已补充说明,麻烦看看
回复

使用道具 举报

发表于 2012-5-4 09:08 | 显示全部楼层
一般在循环的时候都不采用小数做为步长,主要考虑到运算精度的问题


  1. Sub C()
  2. For I = 113 To 110 Step -1
  3.   fu = fu + I / 100
  4.   j = j + 1
  5. Next
  6.   MsgBox "总数: " & fu & " 个数是: " & j & " 平均数是: " & fu / j
  7. End Sub

  8. Sub C1()
  9. For I = 1110 To 1108 Step -1
  10.   fu = fu + I / 1000
  11.   j = j + 1
  12. Next
  13.   MsgBox "总数: " & fu & " 个数是: " & j & " 平均数是: " & fu / j
  14. End Sub


复制代码

回复

使用道具 举报

发表于 2012-5-4 09:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wayy 于 2012-5-4 09:38 编辑

  1. Sub 代码一()
  2. For x = 1.13 To 1.1 Step -0.01
  3. '求1.13到1.10的所有数据之和、平均值,步长为0.01,例如1.13+1.12+1.11+1.10就为总和,平均值为总和/个数=4.46/4=1.115
  4.   fu = fu + x
  5.   j = j + 1
  6.   x = Round(x, 2)
  7. Next
  8. MsgBox fu
  9. MsgBox j
  10. MsgBox "平均" & fu / j
  11. End Sub
复制代码
其实代码2是正确的,代码1是因为小数点的原因导致的不能进行最后一次循环,加一行代码  x = Round(x, 2) 就可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-21 06:39 , Processed in 1.097543 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表