java BigDecimal 和DecimalFormat用法

java.math.BigDecimaljava

BigDecimal類型(+ - * /)所用的屬性app

11.10 BigDecimal類ide

對於不須要任何準確計算精度的數字能夠直接使用float或double,可是若是須要精確計算的結果,則必須使用BigDecimal類,並且使用BigDecimal類也能夠進行大數的操做。BigDecimal類的經常使用方法如表11-15所示。spa

表11-15 BigDecimal類的經常使用方法.net

序號orm

方    法對象

類型blog

描    述ip

1ci

public BigDecimal(double val)

構造

將double表示形式轉換

爲BigDecimal

2

public BigDecimal(int val)

構造

將int表示形式轉換爲

BigDecimal

3

public BigDecimal(String val)

構造

將字符串表示

形式轉換爲BigDecimal

4

public BigDecimal add(BigDecimal augend)

普通

加法

5

public BigDecimal subtract(BigDecimal
subtrahend)

普通

減法

6

public BigDecimal multiply(BigDecimal
multiplicand)

普通

乘法

7

public BigDecimal divide(BigDecimal
divisor)

普通

除法

範例:進行四捨五入的四則運算

  1. package org.lxh.demo11.numberdemo;
  2. import java.math.BigDecimal;
  3. class MyMath {
  4.     public static double add(double d1, double d2)
    {        // 進行加法運算
  5.          BigDecimal b1 = new BigDecimal(d1);
  6.          BigDecimal b2 = new BigDecimal(d2);
  7.         return b1.add(b2).doubleValue();
  8.      }
  9.     public static double sub(double d1, double d2)
    {        // 進行減法運算
  10.          BigDecimal b1 = new BigDecimal(d1);
  11.          BigDecimal b2 = new BigDecimal(d2);
  12.         return b1.subtract(b2).doubleValue();
  13.      }
  14.     public static double mul(double d1, double d2)
    {        // 進行乘法運算
  15.          BigDecimal b1 = new BigDecimal(d1);
  16.          BigDecimal b2 = new BigDecimal(d2);
  17.         return b1.multiply(b2).doubleValue();
  18.      }
  19.     public static double div(double d1,
    double d2,int len) {// 進行除法運算
  20.          BigDecimal b1 = new BigDecimal(d1);
  21.          BigDecimal b2 = new BigDecimal(d2);
  22.         return b1.divide(b2,len,BigDecimal.
    ROUND_HALF_UP).doubleValue();
  23.      }
  24.     public static double round(double d,
    int len) {     // 進行四捨五入
  25. 操做
  26.          BigDecimal b1 = new BigDecimal(d);
  27.          BigDecimal b2 = new BigDecimal(1);
  28.         // 任何一個數字除以1都是原數字
  29.         // ROUND_HALF_UP是BigDecimal的一個常量,
    表示進行四捨五入的操做
  30.         return b1.divide(b2, len,BigDecimal.
    ROUND_HALF_UP).doubleValue();
  31.      }
  32. }
  33. public class BigDecimalDemo01 {
  34.     public static void main(String[] args) {
  35.          System.out.println("加法運算:" +
    MyMath.round(MyMath.add(10.345,
  36. 3.333), 1));
  37.          System.out.println("乘法運算:" +
    MyMath.round(MyMath.mul(10.345,
  38. 3.333), 3));
  39.          System.out.println("除法運算:" +
    MyMath.div(10.345, 3.333, 3));
  40.          System.out.println("減法運算:" +
    MyMath.round(MyMath.sub(10.345,
  41. 3.333), 3));
  42.      }
  43. }

 

 

不可變的、任意精度的有符號十進制數。BigDecimal 由任意精度的整數非標度值和32位的整數標度(scale)組成。

若是爲零或正數,則標度是小數點後的位數。若是爲負數,則將該數的非標度值乘以10的負scale次冪。

所以,BigDecimal表示的數值是(unscaledValue × 10-scale)。

與之相關的還有兩個類:

java.math.MathContext:

該對象是封裝上下文設置的不可變對象,它描述數字運算符的某些規則,如數據的精度,舍入方式等。

java.math.RoundingMode:

這是一種枚舉類型,定義了不少經常使用的數據舍入方式。

這個類用起來仍是很比較複雜的,緣由在於舍入模式,數據運算規則太多太多,

不是數學專業出身的人看着中文API都難以理解,這些規則在實際中使用的時候在翻閱都來得及。

在銀行、賬戶、計費等領域,BigDecimal提供了精確的數值計算。其中8種舍入方式值得掌握。

一、ROUND_UP

舍入遠離零的舍入模式。

在丟棄非零部分以前始終增長數字(始終對非零捨棄部分前面的數字加1)。

注意,此舍入模式始終不會減小計算值的大小。

二、ROUND_DOWN

接近零的舍入模式。

在丟棄某部分以前始終不增長數字(從不對捨棄部分前面的數字加1,即截短)。

注意,此舍入模式始終不會增長計算值的大小。

三、ROUND_CEILING

接近正無窮大的舍入模式。

若是 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;

若是爲負,則舍入行爲與 ROUND_DOWN 相同。

注意,此舍入模式始終不會減小計算值。

四、ROUND_FLOOR

接近負無窮大的舍入模式。

若是 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;

若是爲負,則舍入行爲與 ROUND_UP 相同。

注意,此舍入模式始終不會增長計算值。

五、ROUND_HALF_UP

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。

若是捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同。

注意,這是咱們大多數人在小學時就學過的舍入模式(四捨五入)。

六、ROUND_HALF_DOWN

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。

若是捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同(五舍六入)。

七、ROUND_HALF_EVEN

向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。

若是捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;

若是爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。

注意,在重複進行一系列計算時,此舍入模式能夠將累加錯誤減到最小。

此舍入模式也稱爲「銀行家舍入法」,主要在美國使用。四捨六入,五分兩種狀況。

若是前一位爲奇數,則入位,不然捨去。

如下例子爲保留小數點1位,那麼這種舍入方式下的結果。

1.15>1.2 1.25>1.2

八、ROUND_UNNECESSARY

斷言請求的操做具備精確的結果,所以不須要舍入。

若是對得到精確結果的操做指定此舍入模式,則拋出ArithmeticException。

 

 

不一樣舍入模式下的舍入操做彙總

  根據給定的舍入模式將輸入數字舍入爲一位數的結果 輸入數字 UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN UNNECESSARY 5.5 6 5 6 5 6 5 6 拋出 ArithmeticException 2.5 3 2 3 2 3 2 2 拋出 ArithmeticException 1.6 2 1 2 1 2 2 2 拋出 ArithmeticException 1.1 2 1 2 1 1 1 1 拋出 ArithmeticException 1.0 1 1 1 1 1 1 1 1 -1.0 -1 -1 -1 -1 -1 -1 -1 -1 -1.1 -2 -1 -1 -2 -1 -1 -1 拋出 ArithmeticException -1.6 -2 -1 -1 -2 -2 -2 -2 拋出 ArithmeticException -2.5 -3 -2 -2 -3 -3 -2 -2 拋出 ArithmeticException -5.5 -6 -5 -5 -6 -6 -5 -6 拋出 ArithmeticException

 

 

咱們常常要將數字進行格式化,好比取2位小數,這是最多見的。Java 提供 DecimalFormat 類,幫你用最快的速度將數字格式化爲你須要的樣子。下面是一個例子:

 

 

[java] view plain copy

  1. importjava.text.DecimalFormat;  
  2.     
  3. publicclassTestNumberFormat{  
  4.     
  5.   publicstaticvoidmain(String[]args){  
  6.     doublepi=3.1415927; //圓周率  
  7.     //取一位整數  
  8.     System.out.println(newDecimalFormat("0").format(pi));   //3  
  9.     //取一位整數和兩位小數  
  10.     System.out.println(newDecimalFormat("0.00").format(pi)); //3.14  
  11.     //取兩位整數和三位小數,整數不足部分以0填補。  
  12.     System.out.println(new DecimalFormat("00.000").format(pi));// 03.142  
  13.     //取全部整數部分  
  14.     System.out.println(newDecimalFormat("#").format(pi));   //3  
  15.     //以百分比方式計數,並取兩位小數  
  16.     System.out.println(new DecimalFormat("#.##%").format(pi)); //314.16%  
  17.     
  18.     longc=299792458;  //光速  
  19.     //顯示爲科學計數法,並取五位小數  
  20.     System.out.println(newDecimalFormat("#.#####E0").format(c)); //2.99792E8  
  21.     //顯示爲兩位整數的科學計數法,並取四位小數  
  22.     System.out.println(newDecimalFormat("00.####E0").format(c)); //29.9792E7  
  23.     //每三位以逗號進行分隔。  
  24.     System.out.println(newDecimalFormat(",###").format(c));   //299,792,458  
  25.     //將格式嵌入文本  
  26.     System.out.println(newDecimalFormat("光速大小爲每秒,###米。").format(c));  
  27.   }  
  28. }  

 

  DecimalFormat 類主要靠 # 和 0 兩種佔位符號來指定數字長度。0 表示若是位數不足則以 0 填充,# 表示只要有可能就把數字拉上這個位置。上面的例子包含了差很少全部的基本用法,若是你想了解更多,請參考 DecimalFormat 類的文檔。

相關文章
相關標籤/搜索