返回目录:excel表格制作
前几天咱们的微信公众号里详细介绍了Excel的浮点数的产生原因和处理方法一道简单的算术题,Excel竟然算错了。但是Excel里的浮点由于函数机制等原因,在某些极端情况下隐蔽性很高,所以我再写篇文章介绍下这个坑。
1,计算时产生的大量小数位数
这个结果出现大量小数位数的原因在之前的文章里已经介绍得很详细了,这里不再赘述。
2,无法录入的数据
由于浮点的问题,有些特殊数录入就能生成浮点,导致无法录入正确内容,32768.598有兴趣你就试试在excel里录入这个数。
然而这两种浮点数,在把小数位数调高后都很容易发现异常,因此稍微对Excel有一定了解的伙伴都会知道用ROUND函数修正精度,但是,Excel里存在一类更危险的的浮点数。
截图为目前这类数里目前测试下最简单的算式。0.1+0.2,无论如何调高小数位数还是显示为0.3,使用公式求值或者F9抹黑算式检查也不会出现大量小数位数,均为0.3。等号判断下和直接键入的0.3也是相同的。
但是,如果你把这个算式用于MATCH等函数内,结果却是报错的……
因为对Excel来说,浮点精度是可以超过15位的,可以视为高精度的浮点误差
百度后发现JS里0.1+0.2就是典型浮点误差结果为:
0.30000000000000004
由于Excel有15位精度限制,故只显示出0.3,因为15位下剩余小数位数均为0未显示出来,因此,这个性质说明Excel的浮点精度是可以高于15位的。
在实际测试中,发现部分函数能识别这种高于15位的精度差异,而且这种差异会影响公式结果,这些函数包括:
RANK、FREQUENCY、MATCH、MODE、VLOOKUP、MODE.MULT、HLOOKUP、LOOKUP
有好多同学已经被类似0.1+0.2这种不产生大量小数位数的浮点误差坑过,因为使用F9或者等号检测时都无法检测出这种高于15位的精度差异。
看到这里肯定有人会问,有没有什么函数能直接识别这种精度差?
答案是当然有,有个DELTA函数专门判断参数是不是相等的,可以识别出来,这个函数的结果为1,说明参数完全相等,为0则说明是有差异的:
除了使用ROUND修正精度的方式外,有时候我们也可以使用像COUNTIF这种不识别高于15位的精度的函数来解决这类数值的匹配问题,因为COUNTIF的第二参数在没有无比较运算符和通配符等时,会将数字全部识别为数值型统计且不会识别高于15位的精度。
好了,今天咱们的内容就是这些吧,祝各位小伙伴周末好心情!
图文制作:流浪铁匠