BigDecimal的用法詳解(保留兩位小數,四捨五入,數字格式化,科學計數法轉數字,數字裏的逗號處理)

1、簡介

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變量double能夠處理16位有效數。在實際應用中,須要對更大或者更小的數進行運算和處理。float和double只能用來作科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所建立的是對象,咱們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。構造器是類的特殊方法,專門用來建立對象,特別是帶有參數的對象。

java

2、構造器描述

BigDecimal(int)       建立一個具備參數所指定整數值的對象。
BigDecimal(double) 建立一個具備參數所指定雙精度值的對象。
BigDecimal(long)    建立一個具備參數所指定長整數值的對象。
BigDecimal(String) 建立一個具備參數所指定以字符串表示的數值的對象。

git

3、方法描述

add(BigDecimal)        BigDecimal對象中的值相加,而後返回這個對象。
subtract(BigDecimal) BigDecimal對象中的值相減,而後返回這個對象。
multiply(BigDecimal)  BigDecimal對象中的值相乘,而後返回這個對象。
divide(BigDecimal)     BigDecimal對象中的值相除,而後返回這個對象。
toString()                將BigDecimal對象的數值轉換成字符串。
doubleValue()          將BigDecimal對象中的值以雙精度數返回。
floatValue()             將BigDecimal對象中的值以單精度數返回。
longValue()             將BigDecimal對象中的值以長整數返回。
intValue()               將BigDecimal對象中的值以整數返回。
app

4、經常使用方法

4.一、保留兩位小數

  1. /** 
  2.  * 保留兩位小數 
  3.  */  
  4. @org.junit.Test  
  5. public void formatTest() {  
  6.     double num=13.154215;  
  7.   
  8.     //方式一  
  9.     DecimalFormat df1 = new DecimalFormat("0.00");  
  10.     String str = df1.format(num);  
  11.     System.out.println(str);  //13.15  
  12.   
  13.     //方式二  
  14.     // #.00 表示兩位小數 #.0000四位小數  
  15.     DecimalFormat df2 =new DecimalFormat("#.00");  
  16.     String str2 =df2.format(num);  
  17.     System.out.println(str2);  //13.15  
  18.   
  19.     //方式三  
  20.     //%.2f %. 表示 小數點前任意位數   2 表示兩位小數 格式後的結果爲f 表示浮點型  
  21.     String result = String.format("%.2f", num);  
  22.     System.out.println(result);  //13.15  
  23. }  

String.formate用法詳解:ide

  1.     @Test  
  2.     public void test1() { //4.1541483776749997E9  
  3.         double a = 4887233385.5;  
  4.         double b = 0.85;  
  5.           
  6.         System.out.println("result1-->"+a*b);  // result1-->4.1541483776749997E9  
  7.           
  8.         BigDecimal a1 = new BigDecimal(a);  
  9.         BigDecimal b1 = new BigDecimal(b);  
  10.           
  11.         System.out.println("result2-->"+a1.multiply(b1));//result2-->4154148377.674999891481619無限不循環  
  12.           
  13.         BigDecimal aBigDecimal = new BigDecimal(String.valueOf(a));  
  14.         BigDecimal bBigDecimal = new BigDecimal(String.valueOf(b));  
  15.           
  16.         // 或者下面這種寫法  
  17. //      BigDecimal aBigDecimal = new BigDecimal(Double.toString(a));  
  18. //      BigDecimal bBigDecimal = new BigDecimal(Double.toString(b));  
  19.       
  20.         System.out.println("result3-->"+aBigDecimal.multiply(bBigDecimal)); //result3-->4154148377.675  
  21.   
  22.     }  

4.二、四捨五入

  1. /** 
  2.  * 四捨五入 
  3.  */  
  4. @Test  
  5. public void test2() {  
  6.     double num = 111231.5585;  
  7.     BigDecimal b = new BigDecimal(num);  
  8.     //保留2位小數  
  9.     double result = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();  
  10.     System.out.println(result);  //111231.56  
  11. }  

BigDecimal.setScale()方法用於格式化小數點
setScale(1)表示保留一位小數,默認用四捨五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3 
setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4
函數

setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,若是是5則向下舍工具

setScaler(1,BigDecimal.ROUND_CEILING)接近正無窮大的舍入oop

setScaler(1,BigDecimal.ROUND_FLOOR)接近負無窮大的舍入,數字>0和ROUND_UP做用同樣,數字<0和ROUND_DOWN做用同樣post

setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。性能


註釋:
1:scale指的是你小數點後的位數。好比123.456則score就是3.
score()就是BigDecimal類中的方法啊。
好比:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.
2:roundingMode是小數的保留模式。它們都是BigDecimal中的常量字段,有不少種。
好比:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal對象除以divisor後的結果,而且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊仍是其它的,你能夠本身選!

4:對於通常add、subtract、multiply方法的小數位格式化以下:this

BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("mData=" + mData);
----結果:----- mData=9.66
4.三、格式化

    因爲NumberFormat類的format()方法可使用BigDecimal對象做爲其參數,能夠利用BigDecimal對超出16位有效數字的貨幣值,百分值,以及通常數值進行格式化控制。

  1. /** 
  2.  * 格式化 
  3.  */  
  4. @Test  
  5. public void test3() {  
  6.     NumberFormat currency = NumberFormat.getCurrencyInstance(); //創建貨幣格式化引用  
  7.     NumberFormat percent = NumberFormat.getPercentInstance();  //創建百分比格式化引用  
  8.     percent.setMaximumFractionDigits(3); //百分比小數點最多3位  
  9.   
  10.     BigDecimal loanAmount = new BigDecimal("150.48"); //貸款金額  
  11.     BigDecimal interestRate = new BigDecimal("0.008"); //利率  
  12.     BigDecimal interest = loanAmount.multiply(interestRate); //相乘  
  13.   
  14.     System.out.println("貸款金額:\t" + currency.format(loanAmount)); //貸款金額: ¥150.48  
  15.     System.out.println("利率:\t" + percent.format(interestRate));  //利率: 0.8%  
  16.     System.out.println("利息:\t" + currency.format(interest)); //利息: ¥1.20  
  17. }  

  1. @Test  
  2. public void test3() {  
  3.     DecimalFormat df = new DecimalFormat();  
  4.     double data = 1234.56789//格式化以前的數字  
  5.   
  6.     //一、定義要顯示的數字的格式(這種方式會四捨五入)  
  7.     String style = "0.0";  
  8.     df.applyPattern(style);  
  9.     System.out.println("1-->" + df.format(data));  //1234.6  
  10.   
  11.     //二、在格式後添加諸如單位等字符  
  12.     style = "00000.000 kg";  
  13.     df.applyPattern(style);  
  14.     System.out.println("2-->" + df.format(data));  //01234.568 kg  
  15.   
  16.   
  17.     //三、 模式中的"#"表示若是該位存在字符,則顯示字符,若是不存在,則不顯示。  
  18.     style = "##000.000 kg";  
  19.     df.applyPattern(style);  
  20.     System.out.println("3-->" + df.format(data));  //1234.568 kg  
  21.   
  22.     //四、 模式中的"-"表示輸出爲負數,要放在最前面  
  23.     style = "-000.000";  
  24.     df.applyPattern(style);  
  25.     System.out.println("4-->" + df.format(data)); //-1234.568  
  26.   
  27.   
  28.     //五、 模式中的","在數字中添加逗號,方便讀數字  
  29.     style = "-0,000.0#";  
  30.     df.applyPattern(style);  
  31.     System.out.println("5-->" + df.format(data));  //5-->-1,234.57  
  32.   
  33.   
  34.     //六、模式中的"E"表示輸出爲指數,"E"以前的字符串是底數的格式,  
  35.     // "E"以後的是字符串是指數的格式  
  36.     style = "0.00E000";  
  37.     df.applyPattern(style);  
  38.     System.out.println("6-->" + df.format(data));  //6-->1.23E003  
  39.   
  40.   
  41.     //七、 模式中的"%"表示乘以100並顯示爲百分數,要放在最後。  
  42.     style = "0.00%";  
  43.     df.applyPattern(style);  
  44.     System.out.println("7-->" + df.format(data));  //7-->123456.79%  
  45.   
  46.   
  47.     //八、 模式中的"\u2030"表示乘以1000並顯示爲千分數,要放在最後。  
  48.     style = "0.00\u2030";  
  49.     //在構造函數中設置數字格式  
  50.     DecimalFormat df1 = new DecimalFormat(style);  
  51.     //df.applyPattern(style);  
  52.     System.out.println("8-->" + df1.format(data));  //8-->1234567.89‰  
  53. }  

4.四、BigDecimal比較

BigDecimal是經過使用compareTo(BigDecimal)來比較的,具體比較狀況以下:

  1. /** 
  2.  * 注意不能使用equals方法來比較大小。 
  3.  * 
  4.  * 使用BigDecimal的壞處是性能比double和float差,在處理龐大,複雜的運算時尤其明顯,因根據實際需求決定使用哪一種類型。 
  5.  */  
  6. @Test  
  7. public void test4() {  
  8.     BigDecimal a = new BigDecimal("1");  
  9.     BigDecimal b = new BigDecimal("2");  
  10.     BigDecimal c = new BigDecimal("1");  
  11.     int result1 = a.compareTo(b);  
  12.     int result2 = a.compareTo(c);  
  13.     int result3 = b.compareTo(a);  
  14.   
  15.     System.out.println(result1);  //-1  
  16.     System.out.println(result2);  //0  
  17.     System.out.println(result3);  //1  
  18. }  

4.五、科學計數法

    有些項目可能會涉及到從Excel導入數據,但若是Excel裏單元格類型爲數值,但內容數據太長時(如銀行帳號),導入時,會默認讀取爲科學計數法,用如下代碼便輕鬆解決。

  1. @Test  
  2. public void test5() {  
  3.     BigDecimal bd = new BigDecimal("3.40256010353E11");  
  4.     String result = bd.toPlainString();  
  5.     System.out.println(result);  //340256010353  
  6. }  

4.六、java中價格的數字中間有逗號的處理

  1. @Test  
  2. public void test1() {  
  3.     java.util.StringTokenizer st = new StringTokenizer( "123,456,789"",");  
  4.     StringBuffer sb = new StringBuffer();  
  5.     while(st.hasMoreTokens())   {  
  6.         sb.append(st.nextToken());  
  7.     }  
  8.     System.out.println(sb);  //123456789  
  9. }  
  10.   
  11. @Test  
  12. public void test2() {  
  13.     String str = "123,456,789";  
  14.     str = str.replace(",""");  
  15.     System.out.println(str);  //123456789  
  16. }  

4.7.精確計算

  1. double value1=1.00;  
  2. String value2 = "1.00";  
  3. BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  
  4. BigDecimal b1 = new BigDecimal(String.valueOf(value2));  
  5.   
  6.  public BigDecimal add(BigDecimal value);                        //加法  
  7.  public BigDecimal subtract(BigDecimal value);                   //減法   
  8.  public BigDecimal multiply(BigDecimal value);                   //乘法  
  9.  public BigDecimal divide(BigDecimal value);                     //除法  
下面是一個工具類,該工具類提供加,減,乘,除運算。
  1. public class Arith {  
  2.     /** 
  3.      * 提供精確加法計算的add方法 
  4.      * @param value1 被加數 
  5.      * @param value2 加數 
  6.      * @return 兩個參數的和 
  7.      */  
  8.     public static double add(double value1,double value2){  
  9.         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  
  10.         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  
  11.         return b1.add(b2).doubleValue();  
  12.     }  
  13.       
  14.     /** 
  15.      * 提供精確減法運算的sub方法 
  16.      * @param value1 被減數 
  17.      * @param value2 減數 
  18.      * @return 兩個參數的差 
  19.      */  
  20.     public static double sub(double value1,double value2){  
  21.         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  
  22.         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  
  23.         return b1.subtract(b2).doubleValue();  
  24.     }  
  25.       
  26.     /** 
  27.      * 提供精確乘法運算的mul方法 
  28.      * @param value1 被乘數 
  29.      * @param value2 乘數 
  30.      * @return 兩個參數的積 
  31.      */  
  32.     public static double mul(double value1,double value2){  
  33.         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  
  34.         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  
  35.         return b1.multiply(b2).doubleValue();  
  36.     }  
  37.       
  38.     /** 
  39.      * 提供精確的除法運算方法div 
  40.      * @param value1 被除數 
  41.      * @param value2 除數 
  42.      * @param scale 精確範圍 
  43.      * @return 兩個參數的商 
  44.      * @throws IllegalAccessException 
  45.      */  
  46.     public static double div(double value1,double value2,int scale) throws IllegalAccessException{  
  47.         //若是精確範圍小於0,拋出異常信息  
  48.         if(scale<0){           
  49.             throw new IllegalAccessException("精確度不能小於0");  
  50.         }  
  51.         BigDecimal b1 = new BigDecimal(Double.valueOf(value1));  
  52.         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));  
  53.         return b1.divide(b2, scale).doubleValue();      
  54.     }  
  55. }  
相關文章
相關標籤/搜索