本文总共1708个字,阅读需6分钟,全文加载时间:2.330s,本站综合其他专栏收录该内容! 字体大小:

文章导读:大家好,我们今日继续讲解VBA代码解决方案的第53讲内容:Round函数在VBA中\"Banker's rounding\"算法与在EXCEL中\"四舍五入\"算法比较。在实际工作中经常需要对数值或计算结果进行四舍五入运算,此时可以使用VBA内……各位看官请向下阅读:

大家好,我们今日继续讲解VBA代码解决方案的第53讲内容:Round函数在VBA中\"Banker's rounding\"算法与在EXCEL中\"四舍五入\"算法比较。在实际工作中经常需要对数值或计算结果进行四舍五入运算,此时可以使用VBA内置的Round函数。

虽然\"四舍五入\"是中国最早提出的算法,值得我们自豪,但不能因此就认为它始终是先进的。毕竟它已经有近二千年历史了(大约一千七百多年前,天文学家杨伟就已明确提出了\"四舍五入法\")。四舍五入算法逢五就要进位,带来的问题就是结果偏大,尤其是在大量的数据统计中。误差会很大,而Banker 舍入则在统计概率上解决了这个问题。

Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果,语法如下:

Round(expression [,numdecimalplaces])

参数expression是必需的,要进行四舍五入运算的数值表达式。

参数numdecimalplaces是可选的,数字值,表示进行四舍五入运算时,小数点右边应保留的位数。如果忽略,则Round函数返回整数。

其实,Round 函数在MSDN里的中文释义为四舍五入,这是翻译时的疏忽。在 VB,VBScript,C#,J#,T-SQL 中 Round 函数都是采用 Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。

采用这种算法的目的为了避免四舍五入规则造成的结果偏高,误差偏大的现象出现。准确而言,四舍六入五留双应称作\"四舍六入,逢五无后则留双\",如此就可以完全覆盖此规则的详情。

四舍六入五留双规则的具体方法是:

(一)当尾数小于或等于4时,直接将尾数舍去。

(二)当尾数大于或等于6时,将尾数舍去并向前一位进位。

(三)当尾数为5,而尾数后面的数字均为0时,应看尾数\"5\"的前一位:若前一位数字此时为奇数,就应向前进一位;若前一位数字此时为偶数,则应将尾数舍去。数字\"0\"在此时应被视为偶数。

例如,将下列数字全部修约为四位有效数字,结果为:

12.6450——12.64

18.2750——18.28

(四)当尾数为5,而尾数\"5\"的后面还有任何不是0的数字时,无论前一位在此时为奇数还是偶数,也无论\"5\"后面不为0的数字在哪一位上,都应向前进一位。

例如,将下列数字全部修约为四位有效数字,结果为:

0.326552——0.3266

12.73507——12.74

38.305000001——38.31

VBA内置的Round函数在对数值进行四舍五入运算时实行的就是Bankre舍入,而不是算术舍入。按Bankre舍入规则,如果保留位数的下一个数字正好是5则其后没有其他有效数字,则按保留位最后一位\"偶舍奇入\"的方法进行处理。

为了能够出现所谓的四舍五入的算法,我们可以调用工作表函数,也就是说可以使用工作表函数Round代替VBA内置的Round函数。工作表函数Round和VBA内置的Round函数的用法相同,但它采用算术舍入而不是Bankre舍入,所以不会有\"偶舍奇入\"的问题,如下面的代码所示。

Sub MyRound()

MsgBox \"VBA:Round(4.5)=\" & Round(4.5) & Chr(13) & \"EXCEL:Round(4.5)=\" _

& Application.Round(4.5, 0) & Chr(13) & \"VBA修正:Round(4.5)=\" & Round(4.500001)

End Sub

代码解析:

MyRound过程分别调用VBA内置的Round函数和工作表Round函数在消息框中显示两者运算结果

从运算结果中可以发现:

使用工作表Round函数后Round(4.5)已正确运算为5而不是4。

使用VBA内置Round函数后Round(4.5)已正确运算4。

使用VBA内置Round函数后Round(4.5)可以修正运算为5

实测代码窗口:

运行后:

今日内容回向:

1 什么是\"四舍六入五成双\"算法?

2 上述代码的第三部分VBA修正是如何得到四舍五入的?

以上内容由优质教程资源合作伙伴 “鲸鱼办公” 整理编辑,如果对您有帮助欢迎转发分享!

你可能对这些文章感兴趣:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注