今天财务一早来找我发难,问你写的软件怎么回事,怎么同样的计算结果一边是16.82,一边是16.83,我也奇怪。细细一研究,原来被ROUND函数给暗算了,这个结果是四舍五入后的结果,本身是16.825,ROUND函数有BUG我早就知道,但是一直没有“上过当”,没想今了栽了。Round函数在遇到5时四舍五入“极其随便”,有时候进位,有时候舍去,不知道是什么原则,不去浪费时间研究了。解决问题为第一原则,好在网上有Dave Mc Donald 发布的代替函数,可替换ROUND使用。

7 回复,0 引用: 小心Round函数四舍五入BUG

    • quote 1. tanjh 于  2006-7-23 10:51:03 说:
    • 16.805,16.825,16.845,16.865不会四舍五入进位;
      其他会进位。[smile]
    • 回复该留言
    • quote 2. wwok 于  2006-8-25 19:45:15 说:
    • 用法和ROUND完全一样吗?
    • 回复该留言
    • quote 3. marth 于  2007-7-7 18:18:37 说:
    • excel中 我是用 int(16.83+0.05) 来处理的
      不过看不太懂你的想法,可能是我的环境太简单的缘故

      :D
    • 回复该留言
    • quote 4. 黄海 于  2007-7-11 15:24:15 说:
    • 补充一种方法:

      '自定义自四舍五入函数
      '解决ACCESS97以下版本不支持Round函数
      '解决Round"有名"的四舍六入现象

      '参数: Number , 要进入四舍五入的数值
      '参数:N,要保留的小数位数,不足时以0补上

      '用法:
      'Print myRound(1.4367, 2)
      '1.44
      Function myRound(Number As Double, N As Integer) As String
      myRound = Format(Int(Number * (10 ^ N) + 0.5) / (10 ^ N), "0." & String(N, "0"))
      End Function
    • 回复该留言
    • quote 5. csaaa 于  2007-9-15 19:39:37 说:
    • 傻瓜这个不是BUG是专门设计成这样的.你可以参看微软的文档了解原因.
      黄海 于 2007-9-15 19:39:37 回复
      正如你所说的那样,这个不是BUG,但是我们习惯上把这个函数用来解决四舍五入问题,而函数本身还考虑了总体上的平衡,即“五有时入”,如果知道这个不是BUG也就没有问题了。
    • 回复该留言
    • quote 6. Jack 于  2008-4-16 20:19:15 说:
    • VBA中的Round函数不是Bug,而只是一种特殊算法(银行业算法)。简单地说就是向最近的偶数位舍入。如:Round(3.375,2)==Round(3.385,2)==3.38

      下面的这个函数(算术四舍五入平衡算法)考虑了负数的处理改编自微软文档,可以用于财务系统开发:

      <div style="color:blue;">
      Function SARound(ByVal X As Currency, Optional ByVal Factor As Long = 2) As Currency
      SARound = Fix(X * 10 ^ Factor + Sgn(X) * 0.5) / 10 ^ Factor
      End Function
      </div>
      如果把Fix变为Int就成为不平衡算法。

      MS文档原文:
      http://support.microsoft.com/default.aspx?scid=kb;en-us;196652
      黄海 于 2008-4-16 20:19:15 回复
      正解!
    • 回复该留言
    • quote 7. billschen 于  2010-5-7 9:44:07 说:
    • Jack 说得好!
    • 回复该留言

添加回复

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。