Excel精英培训网

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

[已解决]问题在红色字体部分?请教

[复制链接]
发表于 2013-12-11 22:54 | 显示全部楼层 |阅读模式
Sub 统计()
Dim arr, temp, y As Integer, arr1(1 To 5, 1 To 4)
arr = Range("b2:f12")
y = 600
MsgBox y / 500 - 0.2   '显示为1
MsgBox Int(1)           '显示为1
MsgBox Int(y / 500 - 0.2)  '显示为0,为什么?
For Each temp In arr
    For y = 100 To 1000 Step 100
        If temp < y Then
           arr1((y / 100 - 1) Mod 5 + 1, Int(y / 500 - 0.2) * 2 + 2) = arr1((y / 100 - 1) Mod 5 + 1, Int(y / 500 - 0.2) * 2 + 2) + 1
           Exit For
        End If
    Next y
Next temp
    For y = 100 To 1000 Step 100
        arr1((y / 100 - 1) Mod 5 + 1, Int(y / 500 - 0.2) + 1) = "<" & y
    Next y
    Range("h3:k3") = Array("条件", "个数", "条件", "个数")
    Range("h3").Resize(5, 4) = arr1
End Sub
最佳答案
2013-12-17 23:48
结合网上搜了几个帖,和自己的理解认为:

1.只要相除就是,就是double型
y是int型,500也是,但两者相除的结果一定是double型。

2.double是浮点型。浮点数在计算机中的表示是有误差的,浮点数也是有有效位数的 。也就是说,y/500精确值是1.19999999999...,所以之后减0.2其实只是近似于1,再取整,也就是0。

vba对数据类型的尺度是要宽松的,比如Java在double结果赋值给int型变量会阻止并报错。看来,严谨的机制还是有好处的。
发表于 2013-12-12 09:24 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2013-12-12 10:01 | 显示全部楼层
刘苏 发表于 2013-12-12 09:24
刚测试了一下,没有问题啊

单独测是没问题,把这个全部放在一起,就有问题了
回复

使用道具 举报

发表于 2013-12-17 22:05 | 显示全部楼层
或许是计算精度的问题

Hx = x / 500 - 0.2   
用个变量来过渡一下就解决了,或者不设置 x的类型也能解决

回复

使用道具 举报

发表于 2013-12-17 22:57 | 显示全部楼层
我电脑上这么一句也为0:  MsgBox Int(600 / 500 - 0.2)
应该是电脑中数据的表示问题吧
加个极小极小的数就正确了:MsgBox Int(y / 500 - 0.2 + 0.000000000000001)
回复

使用道具 举报

发表于 2013-12-17 23:00 | 显示全部楼层
记得很久很久以前谭老师的书中,比较两数是否相同时用的就不是=号,而是两数相减<0.00000000001这种形式
回复

使用道具 举报

发表于 2013-12-17 23:29 | 显示全部楼层
确实有问题,解决倒是不难。但这是为什么呢???
回复

使用道具 举报

发表于 2013-12-17 23:48 来自手机 | 显示全部楼层    本楼为最佳答案   
结合网上搜了几个帖,和自己的理解认为:

1.只要相除就是,就是double型
y是int型,500也是,但两者相除的结果一定是double型。

2.double是浮点型。浮点数在计算机中的表示是有误差的,浮点数也是有有效位数的 。也就是说,y/500精确值是1.19999999999...,所以之后减0.2其实只是近似于1,再取整,也就是0。

vba对数据类型的尺度是要宽松的,比如Java在double结果赋值给int型变量会阻止并报错。看来,严谨的机制还是有好处的。
回复

使用道具 举报

发表于 2013-12-18 00:02 | 显示全部楼层
在本机上,
MsgBox (1.2 - 0.2) 为1
MsgBox Int(1.2 - 0.2) 为0
应该就是数的表示问题。
小数的二进制是乘2取整,使得绝大部份小数都是近似数,而不是精确值
回复

使用道具 举报

发表于 2013-12-18 00:19 来自手机 | 显示全部楼层
上清宫主 发表于 2013-12-18 00:02
在本机上,
MsgBox (1.2 - 0.2) 为1
MsgBox Int(1.2 - 0.2) 为0

官方应该给出一套完整的数据类型自动转换和强制转换的帮助,可我一直没找着。

这样也能等于0,学习了

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:37 , Processed in 0.380306 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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