最近因為需要計算報表中的房物出租率,會用到BigDecimal的運算,目前只知道int, double, float等基本型態的我,連BigDecimal是三小都不太清楚,後來查了許多資料才知道原來BigDecimal可以用在精確的數學計算上面,許多商業用報表都需要用到BigDecimal型別。
BigDecimal有兩個較常用到的方法:
BigDecimal(double val)
Translates a double into a BigDecimal.BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
API將上述方法解釋的非常清楚,而我們如果要精確計算,一定得把數值轉型成String型別,否則得到的結果會是有問題的。簡單來說,若要使用BigDecimal做加法計算必須有以下步驟:
- 需要先將兩個浮點數(double)轉為String,並分別宣告為BigDecimal
- 在其中一個浮點數使用add方法,傳入另一個浮點數作為參數
- 作為運算結果的參數(答案)也須宣告為BigDecimal
- 最後把運算的結果(BigDecimal)再轉換為浮點數
在BigDecimal的運算中,加為add, 減為sub,乘為multiply,除法為divide。在做運算之前需針對每一個變數new BigDecimal物件,舉例如下:
- // 精確的加法運算,v1 為加數,v2 為被加數,return v1 + v2
- public static double add(double v1,double v2){
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return b1.add(b2).doubleValue();
- }
在運算之後若需四捨五入該怎麼辦呢?舉例如下:
- // v 為需要四捨五入的數字,scale 為小數點後面要保留幾位數,return 四捨五入後的結果
- public static double round(double v,int scale){
- if(scale < 0){
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero"
- );
- }
- BigDecimal b = new BigDecimal(Double.toString(v));
- BigDecimal one = new BigDecimal("1");
- return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
- }
完整範例請參考以下文字:
- import java.math.BigDecimal;
- public class Testtest {
- public static void main(String[]args){
- // 宣告第一個需要運算的數值
- BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");
- // 宣告第二個需要運算的數值
- BigDecimal bigRate = new BigDecimal(1000);
- // 宣告運算後的答案為 bigResult
- BigDecimal bigResult = new BigDecimal(0);
- // bigResult 為 bigNumBer * bigRate
- bigResult = bigNumber.multiply(bigRate);
- // 印出 bigResult
- System.out.println(bigResult.toString());
- // 將 bigNumber 四捨五入變為 double 型態
- double dData = bigNumber.doubleValue();
- // 印出 dDate
- System.out.println(dData);
- // 宣告 data2 為 bigNumber/bigRate 並四捨五入至小數點第二位
- double data2 = bigNumber
- .divide(bigRate,2,BigDecimal.ROUND_HALF_UP)
- .doubleValue();
- // 印出 data2
- System.out.println(data2);
- }
- }
0 回應:
張貼留言