BigDecimal使用整理
BigDecimal使用整理
一、 BigDecimal簡介
計算機計算中無論是float還是double都是浮點數,由於計算機是二進制的,導致在在浮點數計算時會出現精度丟失,因此引入BigDecimal(java.math.BigDecimal)。
Java在java.math包中提供的 API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變量double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用 java.math.BigDecimal(BigDecimal
二、 BigDecimal構造方法
Bigdecimal構造時,不要直接使浮點數作為構造方法的參數,這樣會出現精度丟失的問題。
Bigdecimal構造時使用BigDecimal.valueOf()方法,或者使用字符串作為BigDecimal構造方法的參數,避免精度丟失的問題。
例如:
? BigDecimal b1 = new BigDecimal("1.23");//1.23
? BigDecimal b2 = BigDecimal.valueOf(1.23);//1.23
? BigDecimal b3 = new BigDecimal(String.valueof(1.23));//1.23
精度丟失例如:
BigDecimal one1 = new BigDecimal(1.23); // 則結果會出現精度問題, 相應值會變成1.229999999999999982236431605997495353221893310546875
另外除了這兩種外,特殊的像0、1、10可以這樣寫。
1. BigDecimal zero = BigDecimal.ZERO;
2. BigDecimal one = BigDecimal.ONE;
3. BigDecimal ten = BigDecimal.TEN;
三、 BigDecimal的加減乘除運算
? public BigDecimal add(BigDecimal value); // 加法
? public BigDecimal subtract(BigDecimal value); // 減法
? public BigDecimal multiply(BigDecimal value); // 乘法
? public BigDecimal divide(BigDecimal value); // 除法
BigDecimal的運算都沒有對原值進行操作,而是返回一個新的BigDecimal對象。
四、 BigDecimal的比較方法(compareTo和equals對比)
BigDecimal在數字上小於、等於或大於被比較對象時,返回 -1、0或 1。
例如:
BigDecimal one = BigDecimal.valueOf(1);
BigDecimal two = new BigDecimal("2");
BigDecimal three = one.add(two);
int i1 = one.compareTo(two); // -1
int i2 = two.compareTo(two); // 0
int i3 = three.compareTo(two); // 1
註意值相等但具有不同精度的兩個BigDecimal對象(如,1.0 和 1.00)被認為是相等的。
註意BigDecimal的比較運算最好不要用equals實現,因為BigDecimal的equals方法在比較的時候要比較兩個數值的精度。
// 精度不同,數值不相等
BigDecimal decimal1 = BigDecimal.valueOf(0);
BigDecimal decimal2 = new BigDecimal("0.00");
System.out.println("the result is " +decimal1.equals(decimal2)); // false
// 設置為相同精度後再次比較
BigDecimal decimal3 = BigDecimal.valueOf(0).setScale(2);
BigDecimal decimal4 = new BigDecimal("0.00").setScale(2);
System.out.println("the result is " +decimal3.equals(decimal4)); // true
使用BigDecimal類equals方法判斷兩個BigDecimal類型的數據時,需要設置精度,否則結果可能不正確
BigDecimal使用整理