Java四捨五入保留小數點後幾位

  1. (double) + Math.round 返回double類型

    // 案例:四捨五入保留小數點後1位
    double d1 = 123.456;
    double d2 = 654.321;
    double v1 = (double) Math.round(d1 * 10) / 10;
    double v2 = (double) Math.round(d2 * 10) / 10;
    System.out.println(v1); // 123.5
    System.out.println(v2); // 654.3
    
  2. DecimalFormat 返回String類型,你可以設置四捨五入的模式,詳見java.math.RoundingMode,提示:負數四捨五入時有不同的模式

    double d1 = 123.456;
    double d2 = 654.321;
    DecimalFormat decimalFormat = new DecimalFormat("#.#");
    decimalFormat.setRoundingMode(RoundingMode.UP);
    String format1 = decimalFormat.format(d1);
    System.out.println(format1);
    String format2 = decimalFormat.format(d2);
    System.out.println(format2);
    
  3. BigDecimal 返回double類型,可以設置四捨五入的模式,提示:負數四捨五入時有不同的模式。注意:BigDecimal#setScale方法返回一個新的BigDecimal對象!

    BigDecimal bigDecimal1 = new BigDecimal(d1);
    BigDecimal bigDecimal2 = new BigDecimal(d2);
    BigDecimal vbd1 = bigDecimal1.setScale(1, BigDecimal.ROUND_HALF_UP);
    BigDecimal vbd2 = bigDecimal2.setScale(1, BigDecimal.ROUND_HALF_UP);
    System.out.println(vbd1.doubleValue());
    System.out.println(vbd2.doubleValue());
    

Java支持七種舍入方式:

  1. ROUND_UP:遠離零方向舍入。向遠離0的方向舍入,也就是說,向絕對值最大的方向舍入,只要捨棄位非0即進位。
  2. ROUND_DOWN:趨向零方向舍入。向0方向靠攏,也就是說,向絕對值最小的方向輸入,注意:所有的位都捨棄,不存在進位情況。
  3. ROUND_CEILING:向正無窮方向舍入。向正最大方向靠攏,如果是正數,舍入行爲類似於ROUND_UP;如果爲負數,則舍入行爲類似於ROUND_DOWN。注意:Math.round方法使用的即爲此模式。
  4. ROUND_FLOOR:向負無窮方向舍入。向負無窮方向靠攏,如果是正數,則舍入行爲類似於 ROUND_DOWN;如果是負數,則舍入行爲類似於ROUND_UP。
  5. HALF_UP:最近數字舍入(5進)。這就是我們最最經典的四捨五入模式。
  6. HALF_DOWN:最近數字舍入(5舍)。在四捨五入中,5是進位的,而在HALF_DOWN中卻是捨棄不進位。
  7. HALF_EVEN:銀行家算法。
    在普通的項目中舍入模式不會有太多影響,可以直接使用Math.round方法,但在大量與貨幣數字交互的項目中,一定要選擇好近似的計算模式,儘量減少因算法不同而造成的損失。

銀行家算法:
四舍:捨棄的數值:0.000、0.001、0.002、0.003、0.004,因爲是捨棄的,對銀行家來說,就不用付款給儲戶了,那每捨棄一個數字就會賺取相應的金額:0.000、0.001、0.002、0.003、0.004。
五入:進位的數值:0.005、0.006、0.007、0.008、0.009,因爲是進位,對銀行家來說,每進一位就會多付款給儲戶,也就是虧損了,那虧損部分就是其對應的10進制補數:0.005、0.004、0.003、0.002、0.001。
因爲捨棄和進位的數字是在0到9之間均勻分佈的,所以對於銀行家來說,每10筆存款的利息因採用四捨五入而獲得的盈利是:

在這裏插入圖片描述
銀行家舍入(Banker’s Round)的近似算法,其規則如下:

  1. 捨去位的數值小於5時,直接捨去;
  2. 捨去位的數值大於等於6時,進位後捨去;
  3. 當捨去位的數值等於5時,分兩種情況:5後面還有其他數字(非0),則進位後捨去;若5後面是0(即5是最後一個數字),則根據5前一位數的奇偶性來判斷是否需要進位,奇數進位,偶數捨去。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章