SumC = SumC + 1 / WorksheetFunction.CountIf(c, cell)的问题

sh210 2008-09-08 10:59:41
最近在看vba,今天看到一段代码,调试后发现问题很怪

Dim cell As Range
Dim SumC As Integer
Dim CountBlank As Integer
SumC = 0
CountBlank = 0

For Each cell In c
If VBA.IsEmpty(cell) Then
CountBlank = CountBlank + 1
Else
SumC = SumC + 1 / WorksheetFunction.CountIf(c, cell)
End If
Next cell

单元格区域的内容是6,4,4,2,2
遍历到第一个4的时候Sumc 应该 = 1+1/2 =1.5,可是调试结果=2,我在想可能是四舍五入的问题
但是到第二个4得时候Sumc = 2+1/2 =2.5,我想这次也应该四舍五入了吧,可是调试结果=2
一直到遍历完,Sumc=2,
很奇怪第一个加0.5和第二个加0.5有什么不同

后又测试区域内容为:6,4,4,2,2,3,7,7,7
发现到遍历过到了3以后,也就是一旦WorksheetFunction.CountIf(c, cell)=1,其后得+0.5得效果一定会等于+1

很搞不懂,请高手赐教
...全文
148 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gracexu 2008-09-10
  • 打赏
  • 举报
回复
楼主真是周到啊,我也跟着学习。
sh210 2008-09-10
  • 打赏
  • 举报
回复
通过查看cpu浮点寄存器,
结论:首先变量是Interger
1、interger变量和double相加,第一次相加四舍五入,以后就不会了
2、如果以后又加了一个interger,其后再加double,第一次一定会四舍五入

自从考了公务员后,很久没有这样了,感觉很不错,谢谢楼上的两位,明天结贴
gracexu 2008-09-09
  • 打赏
  • 举报
回复
楼主很较真嘛。
我为什么要说内存呢,因为这个问题确实是寄存器里面两个数怎么相加的问题。不过感谢楼主做的详尽测试,因为一开始我对这个问题也没有很深的思考。

SumC = SumC + 1 / WorksheetFunction.CountIf(c, cell)

这句话,实际上是一个整数和一个双精度数相加,1 / WorksheetFunction.CountIf(c, cell) ,没有显式声明它的类型,系统默认采取double。
double 类型的数和整数相加,更通用点,是浮点数和整数相加,牵涉到一个对齐的问题,但是系统会怎么对,我没有研究过,从你的结果后,SumC 是2 没错,但是它和那个二进制表示的浮点 0.5 相加后,结果再四舍五入一下,就只剩2了。这里的关键是浮点数的相加不能以我们常识来计算。

总之,这个问题是个类型相关的问题。楼主可以把整数和浮点数相加的问题移植到C 里面去debug看一下它的汇编码。
sh210 2008-09-09
  • 打赏
  • 举报
回复
改成Single后测试得结果正常,二楼内存得说法说不通,你可以试试这个区域
测试区域内容为:6,4,4,2,2,3,3,1,1,5,5,6,6,7,7,8,8,9,9,10,10..........(后面只要是连着得两个相同得数字)

这个区域遍历完了后,SumC的结果永远是2

二楼说的--“至于第二个 4 的时候为什么没有四舍五入,那是因为内存里实际的值并不是整数,加了 0.5 后正好是 2“
经过测试,后面就算有n多个4,SumC的结果永远是2,二楼你得说法站不住脚,
这个问题看来只有用用ice了
ChinaOBS 2008-09-09
  • 打赏
  • 举报
回复
变量类型的问题,按楼上的方法实施
gracexu 2008-09-09
  • 打赏
  • 举报
回复
Dim SumC As Integer

你自己把 SumC 定义为整数的呀,它显示给你看的时候就取整了。
至于第二个 4 的时候为什么没有四舍五入,那是因为内存里实际的值并不是整数,加了 0.5 后正好是 2。

试一下

Dim SumC As Single

5,138

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 Office开发/ VBA
社区管理员
  • Office开发/ VBA社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧