Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評(píng)論 :: 0 Trackbacks
          關(guān)于“四舍五入”
          ?
          ?
          ??? 最近在使用Cognos做前臺(tái)Report的時(shí)候,業(yè)務(wù)部門反映了一個(gè)問題,就是有幾處的四舍五入出現(xiàn)了錯(cuò)誤。在查看了Report之后發(fā)現(xiàn)確實(shí)如此,檢查了所有環(huán)節(jié)都覺得不太會(huì)有設(shè)置不對(duì)的地方,到網(wǎng)上查了查資料,無意中發(fā)現(xiàn)原來四舍五入不止我們小學(xué)時(shí)交的那一種,還有一種是“四舍六入五成雙”的方法,根據(jù)這個(gè)規(guī)則又回去看數(shù)據(jù),果然對(duì)應(yīng)的是這個(gè)方法。
          ?
          ??? 從理論上講,“四舍六入五成雙”是比“四舍五入”更加精確的進(jìn)位方式,慚愧的是對(duì)于這種方法真是聞所未聞。而且不單是我,問了所有的同事和朋友,幾乎都不知道有這樣的一個(gè)方法,看來應(yīng)該不是我忘記掉了,而是學(xué)校里確實(shí)沒有教。簡單講講這個(gè)方法,其實(shí)也很簡單:
          ?
          --------------------------
          ?
          四舍六入五留雙規(guī)則
          ?

          ??? 為了避免四舍五入規(guī)則造成的結(jié)果偏高,誤差偏大的現(xiàn)象出現(xiàn),一般采用四舍六入五留雙規(guī)則(Banker's Rounding)。 四舍六入五留雙應(yīng)該改為: 四舍六入逢五無后則留雙,這樣描述更容易理解和記住.

          四舍六入五留雙規(guī)則的具體方法是:
          ?
          ()當(dāng)尾數(shù)小于或等于4時(shí),直接將尾數(shù)舍去。
          ?
          ??? 例如將下列數(shù)字全部修約為四位有效數(shù)字,結(jié)果為:
          ??? 0.53664——0.5366
          ??? 10.2731——10.27
          ??? 18.5049——18.50?
          ??? 0.58344——0.5834
          ??? 16.4005——16.40
          ??? 27.1829——27.18?
          ?
          ()當(dāng)尾數(shù)大于或等于6時(shí),將尾數(shù)舍去并向前一位進(jìn)位。
          ?
          ??? 例如將下列數(shù)字全部修約為四位有效數(shù)字,結(jié)果為:
          ??? 0.53666——0.5367
          ??? 8.3176——8.318
          ??? 16.7777——16.78
          ??? 0.58387——0.5839
          ??? 10.29501——10.30
          ??? 21.0191——21.02
          ?
          ()當(dāng)尾數(shù)為5,而尾數(shù)后面的數(shù)字均為0時(shí),應(yīng)看尾數(shù)“5”的前一位:若前一位數(shù)字此時(shí)為奇數(shù),就應(yīng)向前進(jìn)一位;若前一位數(shù)字此時(shí)為偶數(shù),則應(yīng)將尾數(shù)舍去。數(shù)字“0”在此時(shí)應(yīng)被視為偶數(shù)。

          ??? 例如將下列數(shù)字全部修約為四位有效數(shù)字,結(jié)果為:
          ??? 0.153050——0.1530
          ??? 12.6450——12.64
          ??? 18.2750——18.28?
          ??? 0.153750——0.1538
          ??? 12.7350——12.74
          ??? 21.845000——21.84?
          ?
          ()當(dāng)尾數(shù)為5,而尾數(shù)“5”的后面還有任何不是0的數(shù)字時(shí),無論前一位在此時(shí)為奇數(shù)還是偶數(shù),也無論“5”后面不為0的數(shù)字在哪一位上,都應(yīng)向前進(jìn)一位。
          ?
          ??? 例如將下列數(shù)字全部修約為四位有效數(shù)字,結(jié)果為:
          ??? 0.326552——0.3266
          ??? 12.73507——12.74
          ??? 21.84502——21.85
          ??? 12.64501——12.65
          ??? 18.27509——18.28
          ??? 38.305000001——38.31
          ?
          ??? 按照四舍六入五留雙規(guī)則進(jìn)行數(shù)字修約時(shí),也應(yīng)像四舍五入規(guī)則那樣,一次性修約到指定的位數(shù),不可以進(jìn)行數(shù)次修約,否則得到的結(jié)果也有可能是錯(cuò)誤的。例如將數(shù)字10.2749945001修約為四位有效數(shù)字時(shí),應(yīng)一步到位:10.2749945001——10.27(正確)。如果按照四舍六入五留雙規(guī)則分步修約將得到錯(cuò)誤結(jié)果:10.2749945001——10.274995——10.275——10.28(錯(cuò)誤)
          ?
          --------------------------
          ?
          ??? 在發(fā)現(xiàn)了這個(gè)問題之后,我找了很多地方進(jìn)行測試,發(fā)現(xiàn)我們平常接觸到得軟件都是使用普通的四舍五入法,例如Excel、Oracle等等,都是用的普通的四舍五入來保留N位小數(shù)。不過再研究Oracle進(jìn)位的時(shí)候倒是發(fā)現(xiàn)了一個(gè)問題:Oracle的默認(rèn)自動(dòng)轉(zhuǎn)換也是四舍五入的,而不是直接截?cái)啵@跟普通的編程軟件是不一樣的。
          ?
          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 閱讀(810) 評(píng)論(0)  編輯  收藏 所屬分類: 16.Others
          主站蜘蛛池模板: 泰州市| 津南区| 恭城| 扎囊县| 额济纳旗| 桦川县| 井陉县| 临桂县| 拉萨市| 务川| 丰城市| 区。| 邻水| 炉霍县| 广州市| 崇礼县| 健康| 朔州市| 苏州市| 英超| 腾冲县| 县级市| 南江县| 漠河县| 苏州市| 沙雅县| 寿宁县| 金平| 南乐县| 新和县| 东海县| 阳西县| 政和县| 吉首市| 东乌珠穆沁旗| 石阡县| 遵义县| 罗城| 西盟| 漳浦县| 泗水县|