2015-02-21 11:23

[轉載] [Java] BigDecimal的四則運算

轉載自:[Java] BigDecimal的四則運算

最近因為需要計算報表中的房物出租率,會用到BigDecimal的運算,目前只知道int, double, float等基本型態的我,連BigDecimal是三小都不太清楚,後來查了許多資料才知道原來BigDecimal可以用在精確的數學計算上面,許多商業用報表都需要用到BigDecimal型別。

BigDecimal有兩個較常用到的方法:
  1. BigDecimal(double val)
    Translates a double into a BigDecimal.
  2. BigDecimal(String val)
    Translates the String repre sentation of a BigDecimal into a BigDecimal.

API將上述方法解釋的非常清楚,而我們如果要精確計算,一定得把數值轉型成String型別,否則得到的結果會是有問題的。簡單來說,若要使用BigDecimal做加法計算必須有以下步驟:
  1. 需要先將兩個浮點數(double)轉為String,並分別宣告為BigDecimal
  2. 在其中一個浮點數使用add方法,傳入另一個浮點數作為參數
  3. 作為運算結果的參數(答案)也須宣告為BigDecimal
  4. 最後把運算的結果(BigDecimal)再轉換為浮點數

在BigDecimal的運算中,加為add, 減為sub,乘為multiply,除法為divide。在做運算之前需針對每一個變數new BigDecimal物件,舉例如下:
  1. // 精確的加法運算,v1 為加數,v2 為被加數,return v1 + v2 
  2. public static double add(double v1,double v2){ 
  3.    BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
  4.    BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
  5.    return b1.add(b2).doubleValue(); 
  6. } 

在運算之後若需四捨五入該怎麼辦呢?舉例如下:
  1. // v 為需要四捨五入的數字,scale 為小數點後面要保留幾位數,return 四捨五入後的結果 
  2. public static double round(double v,int scale){ 
  3.    if(scale < 0){ 
  4.        throw new IllegalArgumentException( 
  5.            "The scale must be a positive integer or zero" 
  6.        ); 
  7.    } 
  8.    BigDecimal b = new BigDecimal(Double.toString(v)); 
  9.    BigDecimal one = new BigDecimal("1"); 
  10.    return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
  11. } 

完整範例請參考以下文字:
  1. import java.math.BigDecimal; 
  2. public class Testtest { 
  3.  
  4.    public static void main(String[]args){ 
  5.  
  6.        // 宣告第一個需要運算的數值 
  7.        BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");  
  8.  
  9.        // 宣告第二個需要運算的數值 
  10.        BigDecimal bigRate = new BigDecimal(1000);  
  11.  
  12.        // 宣告運算後的答案為 bigResult 
  13.        BigDecimal bigResult = new BigDecimal(0); 
  14.  
  15.        // bigResult 為 bigNumBer * bigRate 
  16.        bigResult = bigNumber.multiply(bigRate);  
  17.  
  18.        // 印出 bigResult 
  19.        System.out.println(bigResult.toString());  
  20.  
  21.        // 將 bigNumber 四捨五入變為 double 型態 
  22.        double dData = bigNumber.doubleValue();  
  23.  
  24.        // 印出 dDate 
  25.        System.out.println(dData); 
  26.  
  27.        // 宣告 data2 為 bigNumber/bigRate 並四捨五入至小數點第二位 
  28.        double data2 = bigNumber 
  29.                           .divide(bigRate,2,BigDecimal.ROUND_HALF_UP) 
  30.                           .doubleValue(); 
  31.  
  32.        // 印出 data2 
  33.        System.out.println(data2); 
  34.    } 
  35. } 

0 回應: