打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
慎重使用VBA中的Round函数进行四舍五入

  最近我在大幅修改自己用Access设计的《事业单位人事工资数据管理系统》,其中薪级15级的薪级工资为295,护理人员的薪级工资为295*1.1四舍五入保留到元。
  使用round函数后,奇迹出现了,值为324,与实际正确的值325不一样。
  这让我汗颜,如果不仔细核对每个职工的工资数据,会造成工资数据出错。

  不过在Excel2013工作表中使用Round函数是采用“四舍五入”,而在VBA中Round函数是采用“银行家舍入”,建议大家在VBA中(程序设计中)慎重使用Round函数来四舍五入。(注:很多程序设计中是采用“银行家舍入”)

  在Access中四舍五入可以采用以下方法:
1、使用自定义函数
Public Function RoundFormat(A As Double, B As Integer) As Double
    On Error Resume Next  '如果错误和错误处理程序出现在同一个程序中,从紧随该语句之后的语句处恢复运行
    K = '0'
    If B = 0 Then
        RoundFormat = Format(A, '#')
    Else
        For i = 1 To B - 1
            K = K & K
        Next
        RoundFormat = Format(A, '#.' & K)
    End If
    Application.Volatile    '标记为易失性函数。只要包含此函数的工作表上任何单元格中出现计算过程,此函数都将重新进行计算。
End Function

2、使用Int函数(对于非负数)
举例
要对A进行四舍五入,保留2位小数,这样处理
INT((A*1000 5)/10)/100
要对A进行四舍五入,保留到整数,这样处理
INT((A*10 5)/10)
对于负数大家可以自己思考,结合If进行判断处理负数与非负数。
实际上,我们实际工作中很时候是对正数进行四舍五入。这样就更简单了。

3、结合Int函数编写的自定义函数
Public Function Roundd(A As Double, B As Integer) As Double
    On Error Resume Next  '如果错误和错误处理程序出现在同一个程序中,从紧随该语句之后的语句处恢复运行
    B = B 1
    Roundd = Int((A * 10 ^ B 5) / 10) / (10 ^ B * 0.1)
    Application.Volatile    '标记为易失性函数。只要包含此函数的工作表上任何单元格中出现计算过程,此函数都将重新进行计算。
End Function


  后来,为了弄清Round不能四舍五入的原因:是BUG?是其它?于是费了一番功夫查找了一些“四舍五入”的资料:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一这个四舍五入法是一个国际标准,大部分的编程软件都使用的是这种方法,这种方法还有个名字叫“银行家舍入”,据说国际上一般都是用这种方法的。

  明白这个道理,在VBA中实现真正的“四舍五入”就更容易了,得出第4种四舍五入更好的方法

4、“银行家舍入”变通法实现“四舍五入”

举例
  要对A进行四舍五入,保留B位小数,Round(A 0.1^(B 2),B)

  如果在Excel VBA中进行四舍五入处理,也可以直接调用Excel工作表函数,达到直接四舍五入的目的

Application.Round(A,B)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【VBA研究】取整函数的使用
VBA中ROUND函数浅析
到底是哪里错了?Excel中的四舍五入和VBA的四舍五入竟然不一样?
四舍五入函数round的基本用法
让excel自动取舍小数点,这三个函数都能轻松搞定
计算机二级excel函数考试范围及讲解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服