標籤: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正確的四捨五入方法