1、BigDecimal類概述
由於在運算的時候,float類型和double很容易丟失精度,演示案例。所以,爲了能精確的表示、計算浮點數,Java提供了BigDecimal
不可變的、任意精度的有符號十進制數。
2、構造方法
public BigDecimal(String val):建議使用參數爲字符串的構造方法,如果參數爲double或float,還是會出現不可預知的精度問題
3、BigDecimal類成員方法
public BigDecimal add(BigDecimal augend):加
public BigDecimal subtract(BigDecimal subtrahend):減
public BigDecimal multiply(BigDecimal multiplicand):乘
public BigDecimal divide(BigDecimal divisor):除
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode):商,幾位小數,舍取模式
/**
* 看程序寫結果:結果和我們想的有一點點不一樣,這是因爲float類型的數據存儲和整數不一樣導致的。它們大部分的時候,都是帶有有效數字位。
* 由於在運算的時候,float類型和double很容易丟失精度,演示案例。所以,爲了能精確的表示、計算浮點數,Java提供了BigDecimal
* BigDecimal類:不可變的、任意精度的有符號十進制數,可以解決數據丟失問題。
*/
常規計算方式
public class BigDecimalDemo01 {
public static void main(String[] args) {
//輸出會出現精度問題
System.out.println(0.09 + 0.01); //0.09999999999999999
System.out.println(1.0 - 0.32); //0.6799999999999999
System.out.println(1.015 * 100); //101.49999999999999
System.out.println(1.301 / 100); //0.013009999999999999
System.out.println(1.0 - 0.12); //0.88
}
}
精度計算
public class BigDecimalDemo02 {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("0.09");
BigDecimal bd2 = new BigDecimal("0.01");
System.out.println("add:"+bd1.add(bd2));
System.out.println("------------------");
BigDecimal bd3 = new BigDecimal("1.0");
BigDecimal bd4 = new BigDecimal("0.32");
System.out.println("subtract:"+bd3.subtract(bd4));
System.out.println("------------------");
BigDecimal bd5 = new BigDecimal("1.015");
BigDecimal bd6 = new BigDecimal("100");
System.out.println("multiply:"+bd5.multiply(bd6));
System.out.println("------------------");
BigDecimal bd7 = new BigDecimal("1.301");
BigDecimal bd8 = new BigDecimal("100");
System.out.println("divide:"+bd7.divide(bd8));
System.out.println("divide:"
+ bd7.divide(bd8, 3, BigDecimal.ROUND_HALF_UP));
System.out.println("divide:"
+ bd7.divide(bd8, 8, BigDecimal.ROUND_HALF_UP));
System.out.println("------------------");
}
}
輸出結果:
add:0.10
------------------
subtract:0.68
------------------
multiply:101.500
------------------
divide:0.01301
divide:0.013
divide:0.01301000
------------------