Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算
雙精度浮點型變量double可以處理16位有效數
一般情況下,對於那些不需要準確計算精度的數字,我們可以直接使用Float和Double處理,但是Double.valueOf(String) 和Float.valueOf(String)會丟失精度。所以開發中,如果我們需要精確計算的結果,則必須使用BigDecimal類來操作。
BigDecimal所創建的是對象,故我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。構造器是類的特殊方法,專門用來創建對象,特別是帶有參數的對象。
BigDecimal常用構造函數
2.1、常用構造函數
-
BigDecimal(int)
創建一個具有參數所指定整數值的對象
-
BigDecimal(double)
創建一個具有參數所指定雙精度值的對象
-
BigDecimal(long)
創建一個具有參數所指定長整數值的對象
-
BigDecimal(String)
創建一個具有參數所指定以字符串表示的數值的對象
使用示例:
BigDecimal a =new BigDecimal(0.1);
System.out.println("a values is:"+a);
System.out.println("=====================");
BigDecimal b =new BigDecimal("0.1");
System.out.println("b values is:"+b);
結果示例:
a values is:0.1000000000000000055511151231257827021181583404541015625
=====================
b values is:0.1
原因分析:
1)參數類型爲double的構造方法的結果有一定的不可預知性。有人可能認爲在Java中寫入newBigDecimal(0.1)所創建的BigDecimal正好等於 0.1(非標度值 1,其標度爲 1),但是它實際上等於0.1000000000000000055511151231257827021181583404541015625。這是因爲0.1無法準確地表示爲 double(或者說對於該情況,不能表示爲任何有限長度的二進制小數)。這樣,傳入到構造方法的值不會正好等於 0.1(雖然表面上等於該值)。
2)String 構造方法是完全可預知的:寫入 newBigDecimal(“0.1”) 將創建一個 BigDecimal,它正好等於預期的 0.1。因此,比較而言, 通常建議優先使用String構造方法。
3)當double必須用作BigDecimal的源時,請注意,此構造方法提供了一個準確轉換;它不提供與以下操作相同的結果:先使用Double.toString(double)方法,然後使用BigDecimal(String)構造方法,將double轉換爲String。要獲取該結果,請使用static valueOf(double)方法。
三、BigDecimal常用方法詳解
3.1、常用方法
-
add(BigDecimal)
BigDecimal對象中的值相加,返回BigDecimal對象
-
subtract(BigDecimal)
BigDecimal對象中的值相減,返回BigDecimal對象
-
multiply(BigDecimal)
BigDecimal對象中的值相乘,返回BigDecimal對象
-
divide(BigDecimal)
BigDecimal對象中的值相除,返回BigDecimal對象
-
toString()
將BigDecimal對象中的值轉換成字符串
-
doubleValue()
將BigDecimal對象中的值轉換成雙精度數
-
floatValue()
將BigDecimal對象中的值轉換成單精度數
-
longValue()
將BigDecimal對象中的值轉換成長整數
-
intValue()
將BigDecimal對象中的值轉換成整數
3.2、BigDecimal大小比較
java中對BigDecimal比較大小一般用的是bigdemical的compareTo方法
int a = bigdemical.compareTo(bigdemical2)
返回結果分析:
a = -1,表示bigdemical小於bigdemical2;
a = 0,表示bigdemical等於bigdemical2;
a = 1,表示bigdemical大於bigdemical2;
舉例:a大於等於b
new bigdemica(a).compareTo(new bigdemical(b)) >= 0