1. 程式人生 > >使用計算類BigDecimal寫一個精確計算工具類

使用計算類BigDecimal寫一個精確計算工具類

在日常開放當中需要我們計算數字,利率。通常Java的做法是使用Math相關的API。但是,這樣做是不夠精確的,由於float和double不能進行計算,如果強行進行計算會使得計算不準確。造成難以挽回的損失。為了彌補這一個缺點Java提供了BigDecimal這個類來解決。在使用這個類的時候需要將double轉成String進行計算。為了方便,下面我寫了幾個常用的計算方法,當然也可以自己增加。

import java.math.BigDecimal;
//精確計算工具類
public class CalculateUtils {

	//加法
	public static double add(double var1,double var2){
		BigDecimal b1=new BigDecimal(Double.toString(var1));
		BigDecimal b2=new BigDecimal(Double.toString(var2));
		return b1.add(b2).doubleValue();
	}
	//減法
	public static double sub(double var1,double var2){
		BigDecimal b1=new BigDecimal(Double.toString(var1));
		BigDecimal b2=new BigDecimal(Double.toString(var2));
		return b1.subtract(b2).doubleValue();
	}
	//乘法
	public static double mul(double var1,double var2){
		BigDecimal b1=new BigDecimal(Double.toString(var1));
		BigDecimal b2=new BigDecimal(Double.toString(var2));
		return b1.multiply(b2).doubleValue();
	}
	//除法,scale為精確到小數後的位數
		public static double div(double var1,double var2,int scale){
			if(scale<0){
				throw new IllegalArgumentException("The scale must be a positive integer or zero! ");
			}
			BigDecimal b1=new BigDecimal(Double.toString(var1));
			BigDecimal b2=new BigDecimal(Double.toString(var2));
			return b1.divide(b2,scale, BigDecimal.ROUND_HALF_UP).doubleValue();
		}
		//四捨五入,scale為精確到小數後的位數
		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();
		}
}