轉載自:[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. }  
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()