【注意】new BigDecimal()方法初始化一個浮點型數據時,須要顯示設置Scale(精度)不然運算時可能會有精度問題(這個和BigDecimal 默認精度有關),若是轉成String再初始化,將不受影響java
BigDecimal b1 = new BigDecimal("1");
BigDecimal b2 = new BigDecimal("0.11");
System.out.println(b1.add(b2));
/*
* 能夠試下把傳入的字符串改成基本數據類型再進行運算
*/
複製代碼
BigDecimal b1 = new BigDecimal("1");
BigDecimal b2 = new BigDecimal("0.11");
System.out.println(b1.subtract(b2));
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
BigDecimal b2 = new BigDecimal("0.11");
System.out.println(b1.multiply(b2));
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
BigDecimal b2 = new BigDecimal("0.11");
//四捨五入保留兩位小數 後文將介紹舍入方式
System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));
複製代碼
BigDecimal b1 = new BigDecimal("-1.11");
System.out.println(b1.abs());
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
System.out.println(b1.negate());
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
//二次方
System.out.println(b1.pow(2));
//三次方
System.out.println(b1.pow(3));
複製代碼
BigDecimal b1 = new BigDecimal("11.111");
//位數
System.out.println(b1.precision());//5
//小數點後有多少位
System.out.println(b1.scale());//3
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
BigDecimal b2 = new BigDecimal("0.11");
//大於0 則b1>b2;等於0 則b1==b2;小於0 則b1<b2
System.out.println(b1.compareTo(b2));
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
BigDecimal b2 = new BigDecimal("0.11");
System.out.println(b1.max(b2));
複製代碼
BigDecimal b1 = new BigDecimal("1.11");
BigDecimal b2 = new BigDecimal("0.11");
System.out.println(b1.min(b2));
複製代碼
BigDecimal b1 = new BigDecimal("1.1449");
System.out.println(b1.setScale(2, BigDecimal.ROUND_HALF_UP));//1.14
System.out.println(b1.setScale(3, BigDecimal.ROUND_HALF_UP));//1.145
複製代碼
若是捨去部分大於 0.5 則爲進一,若是是小於 0.5 則會捨去算法
BigDecimal b1 = new BigDecimal("1.1456");
System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_DOWN));//1.1
System.out.println(b1.setScale(2, BigDecimal.ROUND_HALF_DOWN));//1.15
//上例中捨去部分.56 大於.5 因此會進一
複製代碼
BigDecimal b1 = new BigDecimal("1.145");
System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_DOWN));//1.1
System.out.println(b1.setScale(2, BigDecimal.ROUND_HALF_DOWN));//1.14
//上例捨去部分 .5 不大於.5 因此會捨去
複製代碼
BigDecimal b1 = new BigDecimal("1.25");
System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_EVEN));//1.2
b1 = new BigDecimal("1.26");
System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_EVEN));//1.3
b1 = new BigDecimal("1.35");
System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_EVEN));//1.4
b1 = new BigDecimal("1.36");
System.out.println(b1.setScale(1, BigDecimal.ROUND_HALF_EVEN));//1.4
複製代碼
BigDecimal b1 = new BigDecimal("1.1203");
System.out.println(b1.setScale(2, BigDecimal.ROUND_UP));//1.13
System.out.println(b1.setScale(3, BigDecimal.ROUND_UP));//1.121
複製代碼
永遠不會減小計算值的大小bash
BigDecimal b1 = new BigDecimal("1.1209");
System.out.println(b1.setScale(2, BigDecimal.ROUND_DOWN));//1.12
System.out.println(b1.setScale(3, BigDecimal.ROUND_DOWN));//1.120
複製代碼
永遠不會增長計算值的大小ide
BigDecimal b1 = new BigDecimal("1.1209");
System.out.println(b1.setScale(2, BigDecimal.ROUND_CEILING));//1.13
System.out.println(b1.setScale(3, BigDecimal.ROUND_CEILING));//1.121
BigDecimal b2 = b1.negate();//b1的相反數
System.out.println(b2.setScale(2, BigDecimal.ROUND_CEILING));//-1.12
System.out.println(b2.setScale(3, BigDecimal.ROUND_CEILING));//-1.120
複製代碼
此舍入模式始終不會減小計算值。spa
BigDecimal b1 = new BigDecimal("1.1209");
System.out.println(b1.setScale(2, BigDecimal.ROUND_FLOOR));//1.12
System.out.println(b1.setScale(3, BigDecimal.ROUND_FLOOR));//1.120
BigDecimal b2 = b1.negate();
System.out.println(b2.setScale(2, BigDecimal.ROUND_FLOOR));//-1.13
System.out.println(b2.setScale(3, BigDecimal.ROUND_FLOOR));//-1.121
複製代碼
注意,此舍入模式始終不會增長計算值。code
BigDecimal b1 = new BigDecimal("1.25");
System.out.println(b1.setScale(2, BigDecimal.ROUND_UNNECESSARY));//1.25
System.out.println(b1.setScale(1, BigDecimal.ROUND_UNNECESSARY));//throw ArithmeticException
複製代碼
MathContext.DECIMAL32 一個 MathContext 對象,其精度設置與 IEEE 754R Decimal32 格式(即 7 個數字)匹配,舍入模式爲 HALF_EVEN,這是 IEEE 754R 的默認舍入模式。對象
MathContext.DECIMAL64 一個 MathContext 對象,其精度設置與 IEEE 754R Decimal64 格式(即 16 個數字)匹配,舍入模式爲 HALF_EVEN,這是 IEEE 754R 的默認舍入模式。ip
MathContext.DECIMAL128 一個 MathContext 對象,其精度設置與 IEEE 754R Decimal128 格式(即 34 個數字)匹配,舍入模式爲 HALF_EVEN,這是 IEEE 754R 的默認舍入模式。ci
MathContext.UNLIMITED 其設置具備無限精度算法所需值的 MathContext 對象。字符串
【注】詳見第二部分:舍入方式