背景:
在對(duì)數(shù)值做一些計(jì)算的時(shí)候,往往我們需要控制計(jì)算結(jié)果的精度,所以會(huì)使用到DecimalFormat類(lèi)來(lái)將數(shù)值格式化成字符串。在最近測(cè)試中,突然注意到默認(rèn)使用DecimalFormat進(jìn)行格式化時(shí),并非我們一般認(rèn)識(shí)上的四舍五入,而是一種詭異的舍入——(1)5以下舍去(2)5以上舍入(3)若前一位是奇數(shù),5就舍入(4)如前一位是偶數(shù),5就舍去
遇到這樣的統(tǒng)計(jì)結(jié)論,沒(méi)有理論的支持,我們總是感到很迷茫,所以我仔細(xì)查閱了DecimalFormat相關(guān)API,終于找到了答案。
分析:
在DecimalFormat API中有這樣一段:
舍入
|
這句話指出了舍入模式有多種類(lèi)型,而DecimalFormat默認(rèn)采用了RoundingMode.HALF_EVEN
這種類(lèi)型,接下來(lái),我們就一起看看,到底存在哪些舍入類(lèi)型吧
RoundingMode介紹:
RoundingMode
是一個(gè)枚舉類(lèi),有一下幾個(gè)常量:UP,DOWN,CEILING,F(xiàn)LOOR,HALF_UP,HALF_DOWN,HALF_EVEN,UNNECESSARY
UP
public static final RoundingMode UP
- 遠(yuǎn)離零方向舍入的舍入模式。始終對(duì)非零舍棄部分前面的數(shù)字加 1。注意,此舍入模式始終不會(huì)減少計(jì)算值的絕對(duì)值。
示例:
輸入數(shù)字 使用 UP 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 6 2.5 3 1.6 2 1.1 2 1.0 1 -1.0 -1 -1.1 -2 -1.6 -2 -2.5 -3 -5.5 -6
DOWN
public static final RoundingMode DOWN
- 向零方向舍入的舍入模式。從不對(duì)舍棄部分前面的數(shù)字加 1(即截尾)。注意,此舍入模式始終不會(huì)增加計(jì)算值的絕對(duì)值。
示例:
輸入數(shù)字 使用 DOWN 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 5 2.5 2 1.6 1 1.1 1 1.0 1 -1.0 -1 -1.1 -1 -1.6 -1 -2.5 -2 -5.5 -5
CEILING
public static final RoundingMode CEILING
- 向正無(wú)限大方向舍入的舍入模式。如果結(jié)果為正,則舍入行為類(lèi)似于 RoundingMode.UP;如果結(jié)果為負(fù),則舍入行為類(lèi)似于 RoundingMode.DOWN。注意,此舍入模式始終不會(huì)減少計(jì)算值。
示例:
輸入數(shù)字 使用 CEILING 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 6 2.5 3 1.6 2 1.1 2 1.0 1 -1.0 -1 -1.1 -1 -1.6 -1 -2.5 -2 -5.5 -5
FLOOR
public static final RoundingMode FLOOR
- 向負(fù)無(wú)限大方向舍入的舍入模式。如果結(jié)果為正,則舍入行為類(lèi)似于 RoundingMode.DOWN;如果結(jié)果為負(fù),則舍入行為類(lèi)似于RoundingMode.UP。注意,此舍入模式始終不會(huì)增加計(jì)算值。
示例:
輸入數(shù)字 使用 FLOOR 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 5 2.5 2 1.6 1 1.1 1 1.0 1 -1.0 -1 -1.1 -2 -1.6 -2 -2.5 -3 -5.5 -6
HALF_UP
public static final RoundingMode HALF_UP
- 向最接近數(shù)字方向舍入的舍入模式,如果與兩個(gè)相鄰數(shù)字的距離相等,則向上舍入。如果被舍棄部分 >= 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常學(xué)校里講的四舍五入。
示例:
輸入數(shù)字 使用 HALF_UP 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 6 2.5 3 1.6 2 1.1 1 1.0 1 -1.0 -1 -1.1 -1 -1.6 -2 -2.5 -3 -5.5 -6
HALF_DOWN
public static final RoundingMode HALF_DOWN
- 向最接近數(shù)字方向舍入的舍入模式,如果與兩個(gè)相鄰數(shù)字的距離相等,則向下舍入。如果被舍棄部分 > 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。
示例:
輸入數(shù)字 使用 HALF_DOWN 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 5 2.5 2 1.6 2 1.1 1 1.0 1 -1.0 -1 -1.1 -1 -1.6 -2 -2.5 -2 -5.5 -5
HALF_EVEN
public static final RoundingMode HALF_EVEN
- 向最接近數(shù)字方向舍入的舍入模式,如果與兩個(gè)相鄰數(shù)字的距離相等,則向相鄰的偶數(shù)舍入。如果舍棄部分左邊的數(shù)字為奇數(shù),則舍入行為同RoundingMode.HALF_UP;如果為偶數(shù),則舍入行為同RoundingMode.HALF_DOWN。注意,在重復(fù)進(jìn)行一系列計(jì)算時(shí),此舍入模式可以在統(tǒng)計(jì)上將累加錯(cuò)誤減到最小。此舍入模式也稱(chēng)為“銀行家舍入法”,主要在美國(guó)使用。此舍入模式類(lèi)似于 Java 中對(duì)float 和double 算法使用的舍入策略。
示例:
輸入數(shù)字 使用 HALF_EVEN 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 6 2.5 2 1.6 2 1.1 1 1.0 1 -1.0 -1 -1.1 -1 -1.6 -2 -2.5 -2 -5.5 -6
UNNECESSARY
public static final RoundingMode UNNECESSARY
- 用于斷言請(qǐng)求的操作具有精確結(jié)果的舍入模式,因此不需要舍入。如果對(duì)生成精確結(jié)果的操作指定此舍入模式,則拋出 ArithmeticException。
示例:
輸入數(shù)字 使用 UNNECESSARY 舍入模式
將輸入數(shù)字舍入為一位數(shù)5.5 拋出 ArithmeticException 2.5 拋出 ArithmeticException 1.6 拋出 ArithmeticException 1.1 拋出 ArithmeticException 1.0 1 -1.0 -1 -1.1 拋出 ArithmeticException -1.6 拋出 ArithmeticException -2.5 拋出 ArithmeticException -5.5 拋出 ArithmeticException http://blog.csdn.net/alanzyy/article/details/8465098