ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3072|回复: 17

[分享] 危险的MOD函数,我上当得很厉害呀!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2010-6-8 05:06 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我上当得很厉害呀!
       (0.94*10) MOD 10  它的值将是什么?
    很简单: 0.94*10=9.4 。 9.4再对10取模,肯定是9
   如果在0.94的基础上再加一点,比如0.01也就是0.95它将又会是什么呢?
          (0.95*10) MOD 10  它的值将是什么?
大家先别这么快作答。让电脑算过才说话。

TA的精华主题

TA的得分主题

发表于 2010-6-8 05:57 | 显示全部楼层
原帖由 针锦菜 于 2010-6-8 05:06 发表
我上当得很厉害呀!
       (0.94*10) MOD 10  它的值将是什么?
    很简单: 0.94*10=9.4 。 9.4再对10取模,肯定是9


是吗,呵呵

是否单元格格式作祟呀。
你试试看呢
我这里 MOD((0.94*10) ,10)=9.4,MOD((0.95*10),10)=9.5.

很正常呀。

[ 本帖最后由 胡剑0227 于 2010-6-8 06:00 编辑 ]

TA的精华主题

TA的得分主题

发表于 2010-6-8 06:50 | 显示全部楼层

回复 2楼 胡剑0227 的帖子

(0.94*10) MOD 10

好像是vba 里面的吧

TA的精华主题

TA的得分主题

发表于 2010-6-8 07:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-6-8 08:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这不是MOD的错,是浮点运算的错。下面两段代码,因变量类型不同,结果不相同:
Dim a As Variant
a = 0.95
Debug.Print (a * 10) Mod 10
上面代码运行的结果显示是0,下面代码运行的结果是9:
Dim a As Double
a = 0.95
Debug.Print (a * 10) Mod 10

TA的精华主题

TA的得分主题

发表于 2010-6-8 08:45 | 显示全部楼层
原帖由 山菊花 于 2010-6-8 08:27 发表
这不是MOD的错,是浮点运算的错。下面两段代码,因变量类型不同,结果不相同:
Dim a As Variant
a = 0.95
Debug.Print (a * 10) Mod 10
上面代码运行的结果显示是0,下面代码运行的结果是9:
Dim a As Double
...


謝謝斑竹的解釋。

TA的精华主题

TA的得分主题

发表于 2010-6-8 11:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 xihabang 于 2010-6-8 06:50 发表
(0.94*10) MOD 10

好像是vba 里面的吧


哦,是啊,呵呵。开始也感觉这个写法 怎么这么怪呀,呵呵

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-6-9 02:14 | 显示全部楼层
还是山菊老师细心。
我的一段代码,本来结果是0.9588的,因为关系到凑整的问题。
在接下来的判断语句里面,直接给0掉了。这可是钱来的呀!
所以说“上当得很厉害呀!”
到发现时,已经造成损失了。
后面只得把语句改成对1000取余了。
即成 (0.95*1000) MOD 1000
都是没有经验造成的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2010-6-9 02:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-6-9 14:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 山菊花 于 2010-6-8 08:27 发表
这不是MOD的错,是浮点运算的错。下面两段代码,因变量类型不同,结果不相同:
Dim a As Variant
a = 0.95
Debug.Print (a * 10) Mod 10
上面代码运行的结果显示是0,下面代码运行的结果是9:
Dim a As Double
...


虽然在VBA中测试结果和山菊花老是的结果一致,但是还是搞不清楚为什么前一个答案会是0?  浮点运算到底错在了哪里?从上例来看也就是前个例子中变体类型中存放的是一个大于等于0.95的近似值,而后一个双精度型中存放的是一个小于0.95的近似值。
然而如果将数值由0.95改为0.75,得到的结果都为8,这个看来似乎后面的双精神类型中存放的又是一个大于等于0.75的值,也就是说存放进双精度类型的值无法预测?
这个问题该如何解决?

[ 本帖最后由 lbpp 于 2010-6-9 14:51 编辑 ]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-2 23:47 , Processed in 0.038588 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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