Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
关于“四舍五入”
 
 
    最近在使用Cognos做前台Report的时候,业务部门反映了一个问题,就是有几处的四舍五入出现了错误。在查看了Report之后发现确实如此,检查了所有环节都觉得不太会有设置不对的地方,到网上查了查资料,无意中发现原来四舍五入不止我们小学时交的那一种,还有一种是“四舍六入五成双”的方法,根据这个规则又回去看数据,果然对应的是这个方法。
 
    从理论上讲,“四舍六入五成双”是比“四舍五入”更加精确的进位方式,惭愧的是对于这种方法真是闻所未闻。而且不单是我,问了所有的同事和朋友,几乎都不知道有这样的一个方法,看来应该不是我忘记掉了,而是学校里确实没有教。简单讲讲这个方法,其实也很简单:
 
--------------------------
 
四舍六入五留双规则
 

    为了避免四舍五入规则造成的结果偏高,误差偏大的现象出现,一般采用四舍六入五留双规则(Banker's Rounding)。 四舍六入五留双应该改为: 四舍六入逢五无后则留双,这样描述更容易理解和记住.

四舍六入五留双规则的具体方法是:
 
()当尾数小于或等于4时,直接将尾数舍去。
 
    例如将下列数字全部修约为四位有效数字,结果为:
    0.53664——0.5366
    10.2731——10.27
    18.5049——18.50 
    0.58344——0.5834
    16.4005——16.40
    27.1829——27.18 
 
()当尾数大于或等于6时,将尾数舍去并向前一位进位。
 
    例如将下列数字全部修约为四位有效数字,结果为:
    0.53666——0.5367
    8.3176——8.318
    16.7777——16.78
    0.58387——0.5839
    10.29501——10.30
    21.0191——21.02
 
()当尾数为5,而尾数后面的数字均为0时,应看尾数“5”的前一位:若前一位数字此时为奇数,就应向前进一位;若前一位数字此时为偶数,则应将尾数舍去。数字“0”在此时应被视为偶数。

    例如将下列数字全部修约为四位有效数字,结果为:
    0.153050——0.1530
    12.6450——12.64
    18.2750——18.28 
    0.153750——0.1538
    12.7350——12.74
    21.845000——21.84 
 
()当尾数为5,而尾数“5”的后面还有任何不是0的数字时,无论前一位在此时为奇数还是偶数,也无论“5”后面不为0的数字在哪一位上,都应向前进一位。
 
    例如将下列数字全部修约为四位有效数字,结果为:
    0.326552——0.3266
    12.73507——12.74
    21.84502——21.85
    12.64501——12.65
    18.27509——18.28
    38.305000001——38.31
 
    按照四舍六入五留双规则进行数字修约时,也应像四舍五入规则那样,一次性修约到指定的位数,不可以进行数次修约,否则得到的结果也有可能是错误的。例如将数字10.2749945001修约为四位有效数字时,应一步到位:10.2749945001——10.27(正确)。如果按照四舍六入五留双规则分步修约将得到错误结果:10.2749945001——10.274995——10.275——10.28(错误)
 
--------------------------
 
    在发现了这个问题之后,我找了很多地方进行测试,发现我们平常接触到得软件都是使用普通的四舍五入法,例如Excel、Oracle等等,都是用的普通的四舍五入来保留N位小数。不过再研究Oracle进位的时候倒是发现了一个问题:Oracle的默认自动转换也是四舍五入的,而不是直接截断,这跟普通的编程软件是不一样的。
 
SQL> set serveroutput on
SQL>
SQL> declare
  2    a number := 7.8;
  3    i integer;
  4  begin
  5    i := a;
  6    dbms_output.put_line(i);
  7  end;
  8  /
 
8
 
PL/SQL procedure successfully completed
 
    记录一下。
 
 
posted on 2009-05-31 22:11 decode360 阅读(786) 评论(0)  编辑  收藏 所属分类: 16.Others

只有注册用户登录后才能发表评论。


网站导航: