隨筆 - 100  文章 - 50  trackbacks - 0
          <2017年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627281234
          567891011

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          我收藏的一些文章!

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          背景

          在對數(shù)值做一些計算的時候,往往我們需要控制計算結(jié)果的精度,所以會使用到DecimalFormat類來將數(shù)值格式化成字符串。在最近測試中,突然注意到默認(rèn)使用DecimalFormat進(jìn)行格式化時,并非我們一般認(rèn)識上的四舍五入,而是一種詭異的舍入——(1)5以下舍去(2)5以上舍入(3)若前一位是奇數(shù),5就舍入(4)如前一位是偶數(shù),5就舍去

          遇到這樣的統(tǒng)計結(jié)論,沒有理論的支持,我們總是感到很迷茫,所以我仔細(xì)查閱了DecimalFormat相關(guān)API,終于找到了答案。

           

          分析

          在DecimalFormat API中有這樣一段:

          舍入

          DecimalFormat 提供 RoundingMode 中定義的舍入模式進(jìn)行格式化。默認(rèn)情況下,它使用RoundingMode.HALF_EVEN。

          這句話指出了舍入模式有多種類型,而DecimalFormat默認(rèn)采用了RoundingMode.HALF_EVEN這種類型,接下來,我們就一起看看,到底存在哪些舍入類型吧

           

          RoundingMode介紹

          RoundingMode是一個枚舉類,有一下幾個常量:UP,DOWN,CEILING,F(xiàn)LOOR,HALF_UP,HALF_DOWN,HALF_EVEN,UNNECESSARY

           


           

          UP
          public static final RoundingMode UP
          遠(yuǎn)離零方向舍入的舍入模式。始終對非零舍棄部分前面的數(shù)字加 1。注意,此舍入模式始終不會減少計算值的絕對值。

          示例:

          輸入數(shù)字使用 UP 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.56
          2.53
          1.62
          1.12
          1.01
          -1.0-1
          -1.1-2
          -1.6-2
          -2.5-3
          -5.5-6

           


           

          DOWN
          public static final RoundingMode DOWN
          向零方向舍入的舍入模式。從不對舍棄部分前面的數(shù)字加 1(即截尾)。注意,此舍入模式始終不會增加計算值的絕對值。

          示例:

          輸入數(shù)字使用 DOWN 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.55
          2.52
          1.61
          1.11
          1.01
          -1.0-1
          -1.1-1
          -1.6-1
          -2.5-2
          -5.5-5

           


           

          CEILING
          public static final RoundingMode CEILING
          向正無限大方向舍入的舍入模式。如果結(jié)果為正,則舍入行為類似于 RoundingMode.UP;如果結(jié)果為負(fù),則舍入行為類似于 RoundingMode.DOWN。注意,此舍入模式始終不會減少計算值。

          示例:

          輸入數(shù)字使用 CEILING 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.56
          2.53
          1.62
          1.12
          1.01
          -1.0-1
          -1.1-1
          -1.6-1
          -2.5-2
          -5.5-5

           


           

          FLOOR
          public static final RoundingMode FLOOR
          向負(fù)無限大方向舍入的舍入模式。如果結(jié)果為正,則舍入行為類似于 RoundingMode.DOWN;如果結(jié)果為負(fù),則舍入行為類似于RoundingMode.UP。注意,此舍入模式始終不會增加計算值。

          示例:

          輸入數(shù)字使用 FLOOR 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.55
          2.52
          1.61
          1.11
          1.01
          -1.0-1
          -1.1-2
          -1.6-2
          -2.5-3
          -5.5-6

           


           

          HALF_UP
          public static final RoundingMode HALF_UP
          向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向上舍入。如果被舍棄部分 >= 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常學(xué)校里講的四舍五入。

          示例:

          輸入數(shù)字使用 HALF_UP 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.56
          2.53
          1.62
          1.11
          1.01
          -1.0-1
          -1.1-1
          -1.6-2
          -2.5-3
          -5.5-6

           


           

          HALF_DOWN
          public static final RoundingMode HALF_DOWN
          向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向下舍入。如果被舍棄部分 > 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。

          示例:

          輸入數(shù)字使用 HALF_DOWN 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.55
          2.52
          1.62
          1.11
          1.01
          -1.0-1
          -1.1-1
          -1.6-2
          -2.5-2
          -5.5-5

           


           

          HALF_EVEN
          public static final RoundingMode HALF_EVEN
          向最接近數(shù)字方向舍入的舍入模式,如果與兩個相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為同RoundingMode.HALF_UP;如果為偶數(shù),則舍入行為同RoundingMode.HALF_DOWN。注意,在重復(fù)進(jìn)行一系列計算時,此舍入模式可以在統(tǒng)計上將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。此舍入模式類似于 Java 中對float 和double 算法使用的舍入策略。

          示例:

          輸入數(shù)字使用 HALF_EVEN 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.56
          2.52
          1.62
          1.11
          1.01
          -1.0-1
          -1.1-1
          -1.6-2
          -2.5-2
          -5.5-6

           


           

          UNNECESSARY
          public static final RoundingMode UNNECESSARY
          用于斷言請求的操作具有精確結(jié)果的舍入模式,因此不需要舍入。如果對生成精確結(jié)果的操作指定此舍入模式,則拋出 ArithmeticException

          示例:

          輸入數(shù)字使用 UNNECESSARY 舍入模式
          將輸入數(shù)字舍入為一位數(shù)
          5.5拋出 ArithmeticException
          2.5拋出 ArithmeticException
          1.6拋出 ArithmeticException
          1.1拋出 ArithmeticException
          1.01
          -1.0-1
          -1.1拋出 ArithmeticException
          -1.6拋出 ArithmeticException
          -2.5拋出 ArithmeticException
          -5.5拋出 ArithmeticException

           


          http://blog.csdn.net/alanzyy/article/details/8465098
          posted on 2017-02-28 11:14 fly 閱讀(225) 評論(0)  編輯  收藏 所屬分類: java學(xué)習(xí)
          主站蜘蛛池模板: 永嘉县| 中卫市| 和田市| 北海市| 遂宁市| 延津县| 铁力市| 盐津县| 太谷县| 滨州市| 志丹县| 克山县| 谷城县| 巴中市| 营山县| 丘北县| 石景山区| 永济市| 时尚| 静海县| 临泽县| 宜良县| 宜黄县| 铅山县| 曲沃县| 嘉黎县| 大余县| 广河县| 中西区| 上犹县| 岳普湖县| 玛纳斯县| 周宁县| 当雄县| 二手房| 濉溪县| 汉阴县| 舟曲县| 柏乡县| 凤城市| 突泉县|