銀行家舍入算法

銀行家舍入算法

美國銀行家在發現傳統四捨五入算法存在誤差,發明了銀行家舍入算法,該算法的核心爲:

  • 捨去位的數值小於5時,直接捨去
  • 捨去位的數值大於等於6時,進位捨去
  • 當捨去位的數值等於5時,分爲兩種情況:5後面還有其他數字(非0),則進位後捨去;若5後面是0,則根據5前一位數的奇偶性來判斷是否需要進位,奇數進位,偶數捨去。

即:四捨六入五考慮,五後非零就進一,五後爲零看奇偶,五前爲偶應捨去,五前爲奇要進一

舉個栗子:

  	10.4 -> 10
    10.6 -> 11
    10.5 -> 10
    11.5 -> 12

Java代碼調用

 		BigDecimal d = new BigDecimal("888888");
        BigDecimal r = new BigDecimal("0.001875");
        BigDecimal i = d.multiply(r).multiply(new BigDecimal("3")).setScale(2, RoundingMode.HALF_EVEN); //銀行家舍入算法4999.995
        System.out.println(i);

在這裏插入圖片描述
BigDecimal支持的八種舍入方法:
在這裏插入圖片描述
1、 ROUND_UP
舍入遠離零的舍入模式。
在丟棄非零部分之前始終增加數字(始終對非零捨棄部分前面的數字加1)。
注意,此舍入模式始終不會減少計算值的大小。

2、ROUND_DOWN
接近零的舍入模式。
在丟棄某部分之前始終不增加數字(從不對捨棄部分前面的數字加1,即截短)。
注意,此舍入模式始終不會增加計算值的大小。

3、ROUND_CEILING
接近正無窮大的舍入模式。
如果 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;
如果爲負,則舍入行爲與 ROUND_DOWN 相同。
注意,此舍入模式始終不會減少計算值。

4、ROUND_FLOOR
接近負無窮大的舍入模式。
如果 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;
如果爲負,則舍入行爲與 ROUND_UP 相同。
注意,此舍入模式始終不會增加計算值。

5、ROUND_HALF_UP
向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。
如果捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;否則舍入行爲與 ROUND_DOWN 相同。
注意,這是我們大多數人在小學時就學過的舍入模式(四捨五入)。

6、ROUND_HALF_DOWN
向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。
如果捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;否則舍入行爲與 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN
向“最接近的”數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
如果捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;
如果爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。
注意,在重複進行一系列計算時,此舍入模式可以將累加錯誤減到最小。
此舍入模式也稱爲“銀行家舍入法”,主要在美國使用。四捨六入,五分兩種情況。
如果前一位爲奇數,則入位,否則捨去。 以下例子爲保留小數點1位,那麼這種舍入方式下的結果。
1.15>1.2 1.25>1.2

8、ROUND_UNNECESSARY
斷言請求的操作具有精確的結果,因此不需要舍入。
如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章