VBA中ROUND函数浅析
VBA四舍五入函数round()的一些不同四舍五入对于我们来说再熟悉不过了,但这次却碰到一个麻烦的问题。
由于实行全员个人所得税申报,从地税拿到了个人所得税申报软件,按要求把数据都导入后,软件计算出所有职工的当月个人所得税。由于我们发工资有一套自行开发的系统,这里面也有一个计税的模块,因此我就把两个系统的计税结果进行了比较,比较结果是总金额差3分钱。这3分钱对于我们来说可以忽略不计,但对于财务来说那可就麻烦了,相信做财务的人会有体会。(本人不是财务,是做人力资源的)
通过vlookup很快找到了有3个人地税系统中计税多1分钱,然后重点对这3个人的数据进行了分析。由于工资系统不是我写的,于是用VBA写了一个计税模块,结果发现我的计算结果和工资系统一致,比地税的系统差1分钱。跟踪了一下VBA代码发现在对结果进行四舍五入前税是13.765,进行四舍五入后结果为13.76,这个结果和我们按一贯的思路来说就不对了。
这时我想起了读书时老师讲过的另一种四舍五入方法,也就是“四舍六入,五判断,五前是奇则进,五前为偶不进”,简单的说就是“奇进偶不进”(这是我们老师教的,现在知道还有一点的不足)。于是在VBA中又测试了一些数据,果然VBA是按后面的方法来做四舍五入的。
上网查了资料,这个四舍五入法是一个国际标准,大部分的编程软件都使用的是这种方法,这种方法还有个名字叫“银行家舍入”,据说国际上一般都是用这种方法的。
原来如此,看来我找到问题的原因了,激动ing。
接下来,就是想办法找一个真正的四舍五入的算法。
想到一个以前用来向上取整的方法,试试吧。int(13.765*100+0.5)/100
按理来说,这样计算后应该能得到13.77,但实际函数返回结果还是13.76。why?
在VBA的立即窗口中计算
?int(13.765*100+0.5)/100
13.77
怎么是正确的呢,真有点搞糊涂了,明明是进位了,但为什么代码中出来的数据就不进位了呢?
分析一下,立即窗口直接计算和代码返回的值可能不一样,因为代码返回的是一个浮点型数据,而浮点型数据在计算机中存放的是一个近似数,13.765也许机器内存放的是类似13.76499999999这样的一个数,因此加0.5也并没有进位,再取整当然还是不行。
网络真好,又找到一条信息使我对银行家舍入又有了新的认识,上面提到的方法还不完全,实际应该是“四舍六入,五判断,五后非零则进入,五后为零再判断,五前是奇则进,五前为偶不进”。
继续,接着搜索。功夫不负有心人,终于找到一个方法,对于银行家舍入法转换为普通四舍五入的一个巧方法是先加一个很小的数,然后进行四舍五入。我试着用Round(所得税计算(275.3, 0)+0.00001, 2),结果成功了,得到了13.77这个答案。兴奋ing。这个方法其实就是把5后为0的情况变成5后非零,于是就进上去了。达到了“四舍五入”的要求,所以这个方法我觉得不错。
由于实行全员个人所得税申报,从地税拿到了个人所得税申报软件,按要求把数据都导入后,软件计算出所有职工的当月个人所得税。由于我们发工资有一套自行开发的系统,这里面也有一个计税的模块,因此我就把两个系统的计税结果进行了比较,比较结果是总金额差3分钱。这3分钱对于我们来说可以忽略不计,但对于财务来说那可就麻烦了,相信做财务的人会有体会。(本人不是财务,是做人力资源的)
通过vlookup很快找到了有3个人地税系统中计税多1分钱,然后重点对这3个人的数据进行了分析。由于工资系统不是我写的,于是用VBA写了一个计税模块,结果发现我的计算结果和工资系统一致,比地税的系统差1分钱。跟踪了一下VBA代码发现在对结果进行四舍五入前税是13.765,进行四舍五入后结果为13.76,这个结果和我们按一贯的思路来说就不对了。
这时我想起了读书时老师讲过的另一种四舍五入方法,也就是“四舍六入,五判断,五前是奇则进,五前为偶不进”,简单的说就是“奇进偶不进”(这是我们老师教的,现在知道还有一点的不足)。于是在VBA中又测试了一些数据,果然VBA是按后面的方法来做四舍五入的。
上网查了资料,这个四舍五入法是一个国际标准,大部分的编程软件都使用的是这种方法,这种方法还有个名字叫“银行家舍入”,据说国际上一般都是用这种方法的。
原来如此,看来我找到问题的原因了,激动ing。
接下来,就是想办法找一个真正的四舍五入的算法。
想到一个以前用来向上取整的方法,试试吧。int(13.765*100+0.5)/100
按理来说,这样计算后应该能得到13.77,但实际函数返回结果还是13.76。why?
在VBA的立即窗口中计算
?int(13.765*100+0.5)/100
13.77
怎么是正确的呢,真有点搞糊涂了,明明是进位了,但为什么代码中出来的数据就不进位了呢?
分析一下,立即窗口直接计算和代码返回的值可能不一样,因为代码返回的是一个浮点型数据,而浮点型数据在计算机中存放的是一个近似数,13.765也许机器内存放的是类似13.76499999999这样的一个数,因此加0.5也并没有进位,再取整当然还是不行。
网络真好,又找到一条信息使我对银行家舍入又有了新的认识,上面提到的方法还不完全,实际应该是“四舍六入,五判断,五后非零则进入,五后为零再判断,五前是奇则进,五前为偶不进”。
继续,接着搜索。功夫不负有心人,终于找到一个方法,对于银行家舍入法转换为普通四舍五入的一个巧方法是先加一个很小的数,然后进行四舍五入。我试着用Round(所得税计算(275.3, 0)+0.00001, 2),结果成功了,得到了13.77这个答案。兴奋ing。这个方法其实就是把5后为0的情况变成5后非零,于是就进上去了。达到了“四舍五入”的要求,所以这个方法我觉得不错。
赞 (0)