ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] MATCH函数内部的高精度带来的问题即应对策略

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:29 | 显示全部楼层 |阅读模式
本帖最后由 胡剑0227 于 2012-2-15 15:35 编辑

MATCH的执行精度问题年前带数组班的时候就发现了,还是班长hustnzj在讨论一个问题的发现了,当时想写一下,后来由于某些事情就溜掉了。今天偶尔用MATCH做做题,又撞上了,这下不让它溜走了,呵呵。

疑问.jpg
        如上图所示,B6单元格显示为【232】,公式为 【=MOD("02:27"-"22:35",1)*1440】,使用F9求值显示结果为【232】,并且直接使用比较运算符【=】将B6单元格和纯数值232的C17单元格进行比较依然返回TURE,如下图C19单元格公式所示。但是,对,此处如你所料是一个转折,使用MATCH函数将B6单元格和序数数组1-1440进行匹配却返回【231】,而不是期望中的【232】,如上图B9单元格所示,其对的具体公式为【=MATCH(B6,ROW($1:$1440),1)】。
猜想.jpg
      为什么会这样呢?有限精度么!有限精度带来的误差引起的。
      没错,但毕竟稍微笼统了一些,不便于进一步的了解进而找出相对应的策略来处理这个问题。Excel的精度是15位有效数字,在论坛泡过一阵的人都了解这点,从F9显示232、用比较运算符【=】判决等于232可以得出在15位精度下B6单元格确实等于232。但MATCH函数的比对结果显示,在MATCH函数内部执行过程中B6单元格并没有被当成232,而是十分接近232且小于232的一个数值,即MATCH函数内部可以区分出B6单元格与232之间的细微差别,也即MATCH函数内部的精度是更高的。
      于是,问题就这样出现了:MATCH函数内部执行代码的高精度,使得15位数字精度造成的误差不能被忽略,最终导致逻辑和预想不符合。这就好比用极高分辨率的摄像头近距离拍明星的脸,这个时候就能暴露出那些原本近乎完美的脸原来也是那般坑坑洼洼,要解决这个问题就是像素不能那么高,这样就能忽略那些小毛刺了。

解决方案1:

于是,参考【降低摄像机像素】的思路,我们也可以人为加入舍入函数,从效果上达到降低MATCH函数执行精度的目的。模型,高分辨率的摄像头直接拍明星的脸自然可以捕捉到那些坑坑洼洼,但如果事先用低分辨率摄取图像屏蔽那些坑坑洼洼,即像素中不存在这些信息了,那么后续用高分辨率摄像头再拍经低分辨率摄像头摄像的图片时就再也不可能捕捉到那些坑坑洼洼了。这就是具体的原理,在本题中就是对B6单元格进行舍入处理再作为MATCH函数的第一参数 【=MATCH(INT(B6),ROW($1:$1440),1)】,如下图所示,其中INT函数就起到了低像素摄像机的功能。
思路模型.png

解决方案2:

记得做物理电学实验时学过一个替换法,该方法实现比较简单,但思路别具一格。要测试一用电器的电阻,虽然有经典的公式=电压/电流,但是要测电压和电流就会引入额外的误差,替换法的思路就是用微调电阻替换用电器,微调电阻使得高敏度电流、电压表的读数和用电器一致。即只关心电路状态达到一致,并不真正使用那些数值,这样对于用电器和微调电阻来说所有的误差都是等价的,额外的误差都相互抵消了...

误差抵消.png
上图,即是演示了一把误差和相互抵消的例子,其中查找值 和 查找序列 的产生机制是完全一样的,因此最后依然可以做到完全匹配,此时C55单元格即使使用精确匹配依然可以返回正确的值。



指导思路:
1、通过舍入函数在效果上降低查找类函数的执行精度,使得有限精度带来的计算误差不影响最终的结果;
2、找值和查找序列使用相同的机制产生,让误差相互抵消,使得最后的结果符合预期逻辑;

===================================背景知识===============================================
1.日期和时间的实质是序列值,数字1对应一天,数字1的24等分对应一天中的一个小时,依次类推1分钟就对应1的1440等分...
2.符合日期和时间格式的文本参与必须由数值参与的运算时,可以被Excel智能识别出的对应的序列值。如公式【=MOD("02:27"-"22:35",1)*1440】中参与减法运算的两个时间。

该贴已经同步到 胡剑0227的微博

龙年日历下载

MATCH函数的执行精度-2003.rar

6.99 KB, 下载次数: 121

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:32 | 显示全部楼层
坐等学习!

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:42 | 显示全部楼层
胡版又要出精品, 强烈围观学习~~~~

点评

精品,真不敢,这个绝对算不上,只是一个小问题  发表于 2012-2-12 20:43

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:47 | 显示全部楼层
问题在MOD身上。
=MATCH(232,ROW(1:1440))=232
=MATCH(231.999999,ROW(1:1440))=231
MOD("02:27"-"22:35",1)*1440<>232而是<232,可以采用专门的数学软件计算一下。

点评

恩,是MATCH的精度机制和MOD的引起的误差共同造就的...  发表于 2012-2-12 20:44

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:49 | 显示全部楼层
本帖最后由 hjj0451 于 2012-2-12 10:57 编辑

在EXCEL里用表达式或摸黑判断MOD("02:27"-"22:35",1)*1440与232的关系是没用的,判断的计算过程第2步已对MOD的精度进行了处理。
所以对于这些浮点运算误差问题,处理之前还是用ROUND处理一下比较好,否则返回意外的结果。
谢谢胡版。

点评

恩,就是平时不太容易察觉...除非偶尔发现问题了,呵呵。加ROUND弱化MATCH的精度,呵呵  发表于 2012-2-12 20:45

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:58 | 显示全部楼层
本帖最后由 CheryBTL 于 2012-2-12 12:04 编辑
hjj0451 发表于 2012-2-12 11:47
问题在MOD身上。
=MATCH(232,ROW(1:1440))=232
=MATCH(231.999999,ROW(1:1440))=231

按你的说法,应该是MOD的问题了,
再追根的话,还会归结到Excel时间系统的问题,
因为时间相减后得到的结果(因为时间转换过程中小时转分钟的24,主要其中含有3)会产生循环小说0.333333....或其倍数,在分钟不是3的整数倍时会返回非整数结果,导致MATCH不能精确匹配了~~~

只是感觉,可能我描述的还不够准确。。。 我是这样考虑的,需要进一步验证

点评

呵呵,有限精度的运算带来误差是难免的,问题是MATCH的执行精度高于15位,导致这些误差对返回结果产生了干扰,与表达的逻辑不匹配了,这个是关键。  发表于 2012-2-12 20:47
恩,7楼补充了一下。  发表于 2012-2-12 12:00

TA的精华主题

TA的得分主题

发表于 2012-2-12 11:59 | 显示全部楼层
另外一种方法:
A1=MOD("02:27"-"22:35",1)*1440
A2=MATCH(A1,ROW(1:1440))
然后工具-选项里勾选以显示的精度为准,则A2=232
不勾选的话A2=231

TA的精华主题

TA的得分主题

发表于 2012-2-12 12:10 | 显示全部楼层
本帖最后由 CheryBTL 于 2012-2-12 12:21 编辑
hjj0451 发表于 2012-2-12 11:59
另外一种方法:
A1=MOD("02:27"-"22:35",1)*1440
A2=MATCH(A1,ROW(1:1440))

个人感觉不能这么看
要这么看吧:
MOD("02:27"-"22:35",1)的结果:0.161111111111111
1000*上述结果为:161.11111 11111 11
400*上述结果为: 64.44444 44444 444
40*上述结果为:    6.44444 44444 4444
相加后 是           231.99999 99999 9984不是232

TA的精华主题

TA的得分主题

发表于 2012-2-12 12:12 | 显示全部楼层
CheryBTL 发表于 2012-2-12 11:10
个人感觉不能这么看
要这么看吧:
MOD("02:27"-"22:35",1)的结果:0.161111111111111

恩,那只是对精度问题的一种说明。如果不存在15位精度的处理,就没有疑问了。

TA的精华主题

TA的得分主题

发表于 2012-2-12 12:24 | 显示全部楼层
hjj0451 发表于 2012-2-12 12:12
恩,那只是对精度问题的一种说明。如果不存在15位精度的处理,就没有疑问了。

嗯,是的 其实这个问题在用1/COUNTF求不重复值时就曾考虑过,一直不得门路,也就相当然的用了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-16 13:24 , Processed in 0.050166 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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