1. 程式人生 > >BigDecimal用法詳解

BigDecimal用法詳解

一.簡介

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

 二.構造方法

  BigDecimal(int)       建立一個具有引數所指定整數值的物件。  
  BigDecimal(double) 建立一個具有引數所指定雙精度值的物件。  
  BigDecimal(long)    建立一個具有引數所指定長整數值的物件。  
  BigDecimal(String) 建立一個具有引數所指定以字串表示的數值的物件。

三.主要方法:

  add(BigDecimal)        BigDecimal物件中的值相加,然後返回這個物件。  
  subtract(BigDecimal) BigDecimal物件中的值相減,然後返回這個物件。  
  multiply(BigDecimal)  BigDecimal物件中的值相乘,然後返回這個物件。  
  divide(BigDecimal)     BigDecimal物件中的值相除,然後返回這個物件。  
  toString()                將BigDecimal物件的數值轉換成字串。  
  doubleValue()          將BigDecimal物件中的值以雙精度數返回。  
  floatValue()             將BigDecimal物件中的值以單精度數返回。  
  longValue()             將BigDecimal物件中的值以長整數返回。  
  intValue()               將BigDecimal物件中的值以整數返回。
四.BigDecimal.setScale 處理java小數點

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則向下舍
五.程式碼


import java.math.BigDecimal;   

/**  

* 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精  

* 確的浮點數運算,包括加減乘除和四捨五入。  

*/  

public class Arith{ //預設除法運算精度   

private static final int DEF_DIV_SCALE = 10; //這個類不能例項化   

private Arith(){   

}   

/**  

* 提供精確的加法運算。  

* @param v1 被加數  

* @param v2 加數  

* @return 兩個引數的和  

*/  

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();   

}   

/**  

* 提供精確的減法運算。  

* @param v1 被減數  

* @param v2 減數  

* @return 兩個引數的差  

*/  

public static double sub(double v1,double v2){   

BigDecimal b1 = new BigDecimal(Double.toString(v1));   

BigDecimal b2 = new BigDecimal(Double.toString(v2));   

return b1.subtract(b2).doubleValue();   

}   

/**  

* 提供精確的乘法運算。  

* @param v1 被乘數  

* @param v2 乘數  

* @return 兩個引數的積  

*/  

public static double mul(double v1,double v2){   

BigDecimal b1 = new BigDecimal(Double.toString(v1));   

BigDecimal b2 = new BigDecimal(Double.toString(v2));   

return b1.multiply(b2).doubleValue();   

}   

/**  

* 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到  

* 小數點以後10位,以後的數字四捨五入。  

* @param v1 被除數  

* @param v2 除數  

* @return 兩個引數的商  

*/  

public static double div(double v1,double v2){   

return div(v1,v2,DEF_DIV_SCALE);   

}   

/**  

* 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指  

* 定精度,以後的數字四捨五入。  

* @param v1 被除數  

* @param v2 除數  

* @param scale 表示表示需要精確到小數點以後幾位。  

* @return 兩個引數的商  

*/  

public static double div(double v1,double v2,int scale){   

if(scale<0){   

throw new IllegalArgumentException(   

"The scale must be a positive integer or zero");   

}   

BigDecimal b1 = new BigDecimal(Double.toString(v1));   

BigDecimal b2 = new BigDecimal(Double.toString(v2));   

return b2.divide(b1,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   

}   

/**  

* 提供精確的小數位四捨五入處理。  

* @param v 需要四捨五入的數字  

* @param 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();   

}   

};