64岁Python之父决定加入微软,还是玩Excel有意思
在Python教程满天飞的时候,发生了一件有意思的事儿。吉多·范罗苏姆(Guido van Rossum)Python之父,前几天被证实加入微软的开发部门。
64岁的人了,也不退休享清福,居然加入微软,看来还是微软有意思。年纪轻轻的你,是不是更应该多花点时间来研究Excel?
VIP学员的问题,基本分40,年度指标10,完成情况有超标也有不达标,超标每增加1%加0.5分,不达标每减1%扣0.25分。不足1%部分,忽略不计,比如0.99%也按0%算。
看起来挺简单的,在实际计算过程中却涉及到非常多知识点,跟着卢子一起来看看。
算比例的时候一切正常。
=(C2-B2)/B2
可是当你嵌套ROUNDDOWN函数以后,你就傻眼了,-0.01居然得到0,怎么回事?
=ROUNDDOWN((C2-B2)/B2,2)
在编辑栏选中(C2-B2)/B2,按F9键(部分笔记本按Fn+F9),得到这么一串数字-0.00999999999999996。
这个专业名词叫浮点运算误差,一般遇到这种情况都是嵌套ROUND函数解决,但是在这里是不可以这么用的。一旦嵌套了,像0.0055就变成0.01也就是1%,会计算错误,因为不足1%是要舍去的。
对于这种特殊情况,考虑了一会,想到了解决的方法,就是可以加减一个很小很小的数字,比如0.0001。一来不影响舍入的问题,二来可以解决浮点运算误差。
先测试不达标情况,减去0.0001,结果正确。
再来测试超标情况,加上0.0001,结果也正确。
上面是手工判断,其实用IF函数就可以达到自动判断。
=ROUNDDOWN((C2-B2+IF(C2<B2,-0.0001,0.0001))/B2,2)
以上是难点,下面就是最平常的判断,我直接发最终公式。1%%就是0.0001,为了省字符。
=A2+IF(C2>B2,0.5,0.25)*ROUNDDOWN((C2-B2+IF(C2>B2,1,-1)*1%%)/B2,2)/1%
最后,其实这个学员给出的方案应该不是最标准的。
标准的方案,都会涉及到上限比如100分,下限比如20分。
如果需要上限和下限,需要再嵌套MEDIAN函数,这个是中位数,获取中间的值。
作者:卢子,清华畅销书作者,《Excel效率手册 早做完,不加班》系列丛书创始人,个人公众号:Excel不加班(ID:Excelbujiaban)