JAVA正確的四捨五入方法

來源:互聯網
上載者:User

標籤:scale   複製   post   body   inf   使用   form   .text   logs   

原文:http://www.cnblogs.com/yangzhilong/p/8405840.html

 

 

在JDK版本為1.8的情況運行下面的代碼,會發現很神奇的情況(見運行結果)。

看如下代碼:

package com.longge.mytest;import java.math.BigDecimal;import java.math.RoundingMode;import java.text.DecimalFormat;import org.junit.Test;public class TestDecimal {    @Test    public void test() {        BigDecimal a = new BigDecimal(0.075);        BigDecimal a1 = new BigDecimal(10.075);        BigDecimal a2 = new BigDecimal(100.075);                BigDecimal b = new BigDecimal(0.074);        BigDecimal b1 = new BigDecimal(10.074);        BigDecimal b2 = new BigDecimal(100.074);                BigDecimal c = new BigDecimal("0.075");        BigDecimal c1 = new BigDecimal("10.075");        BigDecimal c2 = new BigDecimal("100.075");                DecimalFormat df = new DecimalFormat("#0.00");                BigDecimal one = BigDecimal.ONE;                // 0.07        System.out.println(a.divide(one, 2, RoundingMode.HALF_UP).doubleValue());        // 0.08        System.out.println(a.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());        // 0.07        System.out.println(b.divide(one, 2, RoundingMode.HALF_UP).doubleValue());        // 0.07        System.out.println(b.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());        // 0.07        System.out.println(df.format(0.074));        // 0.07        System.out.println(df.format(0.075));        // 0.08        System.out.println(c.divide(one, 2, RoundingMode.HALF_UP).doubleValue());                System.out.println("----------------------------");                // 10.07        System.out.println(a1.divide(one, 2, RoundingMode.HALF_UP).doubleValue());        // 10.08        System.out.println(a1.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());        // 10.7        System.out.println(b1.divide(one, 2, RoundingMode.HALF_UP).doubleValue());        // 10.07        System.out.println(b1.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());        // 10.07        System.out.println(df.format(10.074));        // 10.07        System.out.println(df.format(10.075));        // 10.08        System.out.println(c1.divide(one, 2, RoundingMode.HALF_UP).doubleValue());                System.out.println("----------------------------");                // 100.08        System.out.println(a2.divide(one, 2, RoundingMode.HALF_UP).doubleValue());        // 100.08        System.out.println(a2.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());        // 100.07        System.out.println(b2.divide(one, 2, RoundingMode.HALF_UP).doubleValue());        // 100.07        System.out.println(b2.divide(one).add(new BigDecimal("0.0000000001")).setScale(2, RoundingMode.HALF_UP).doubleValue());        // 100.07        System.out.println(df.format(100.074));        // 100.08        System.out.println(df.format(100.075));        // 100.08        System.out.println(c2.divide(one, 2, RoundingMode.HALF_UP).doubleValue());    }}

 

運行結果如下:

0.07
0.08
0.07
0.07
0.07
0.07
0.08
----------------------------
10.07
10.08
10.07
10.07
10.07
10.07
10.08
----------------------------
100.08
100.08
100.07
100.07
100.07
100.08
100.08

其中可選模式有:

1、 ROUND_UP:遠離零方向舍入。向絕對值最大的方向舍入,只要捨棄位非0即進位。

2、 ROUND_DOWN:趨向零方向舍入。向絕對值最小的方向輸入,所有的位都要捨棄,不存在進位情況。

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是要捨棄的。

7、 HAIL_EVEN:銀行家舍入法。

 

查看JDK的官方說明:

所以在做對精度要求高的計算時,要將double/float轉成字串後再轉成BigDecimal進行計算

JAVA正確的四捨五入方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.