/Files/kokosang/DoubleUtil.txt
package frameWork.util;
package frameWork.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
/**
* 由于Java的簡(jiǎn)單類型不能夠精確的對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算,這個(gè)工具類提供精
* 確的浮點(diǎn)數(shù)運(yùn)算,包括加減乘除和四舍五入。
*/
public class DoubleUtil {
//這個(gè)類不能實(shí)例化
private DoubleUtil(){
}
//默認(rèn)除法運(yùn)算精度
private static final int DEF_DIV_SCALE = 10;
//默認(rèn)的保留位數(shù)
private static DecimalFormat df=new DecimalFormat("0.00");
/**
* 按照格式保留幾位
* @param money double數(shù)
* @param format 格式
* @return
*/
public static double format(double money,String format){
if(format != null && format != ""){
df=new DecimalFormat(format);
}
double moneyformat=new Double(df.format(money).toString());
return moneyformat;
}
/**
* 提供精確的加法運(yùn)算。
* @param v1 被加數(shù)
* @param v2 加數(shù)
* @return 兩個(gè)參數(shù)的和
*/
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();
}
/**
* 提供精確的減法運(yùn)算。
* @param v1 被減數(shù)
* @param v2 減數(shù)
* @return 兩個(gè)參數(shù)的差
*/
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();
}
/**
* 提供精確的乘法運(yùn)算。
* @param v1 被乘數(shù)
* @param v2 乘數(shù)
* @return 兩個(gè)參數(shù)的積
*/
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();
}
/**
* 提供(相對(duì))精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到
* 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @return 兩個(gè)參數(shù)的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相對(duì))精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指
* 定精度,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。
* @return 兩個(gè)參數(shù)的商
*/
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 b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精確的小數(shù)位四舍五入處理。
* @param v 需要四舍五入的數(shù)字
* @param scale 小數(shù)點(diǎn)后保留幾位
* @return 四舍五入后的結(jié)果
*/
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();
}
/**
* 提供精確的類型轉(zhuǎn)換(Float)
* @param v 需要被轉(zhuǎn)換的數(shù)字
* @return 返回轉(zhuǎn)換結(jié)果
*/
public static float convertsToFloat(double v){
BigDecimal b = new BigDecimal(v);
return b.floatValue();
}
/**
* 提供精確的類型轉(zhuǎn)換(Int)不進(jìn)行四舍五入
* @param v 需要被轉(zhuǎn)換的數(shù)字
* @return 返回轉(zhuǎn)換結(jié)果
*/
public static int convertsToInt(double v){
BigDecimal b = new BigDecimal(v);
return b.intValue();
}
/**
* 提供精確的類型轉(zhuǎn)換(Long)
* @param v 需要被轉(zhuǎn)換的數(shù)字
* @return 返回轉(zhuǎn)換結(jié)果
*/
public static long convertsToLong(double v){
BigDecimal b = new BigDecimal(v);
return b.longValue();
}
/**
* 返回兩個(gè)數(shù)中大的一個(gè)值
* @param v1 需要被對(duì)比的第一個(gè)數(shù)
* @param v2 需要被對(duì)比的第二個(gè)數(shù)
* @return 返回兩個(gè)數(shù)中大的一個(gè)值
*/
public static double returnMax(double v1,double v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.max(b2).doubleValue();
}
/**
* 返回兩個(gè)數(shù)中小的一個(gè)值
* @param v1 需要被對(duì)比的第一個(gè)數(shù)
* @param v2 需要被對(duì)比的第二個(gè)數(shù)
* @return 返回兩個(gè)數(shù)中小的一個(gè)值
*/
public static double returnMin(double v1,double v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.min(b2).doubleValue();
}
/**
* 精確對(duì)比兩個(gè)數(shù)字
* @param v1 需要被對(duì)比的第一個(gè)數(shù)
* @param v2 需要被對(duì)比的第二個(gè)數(shù)
* @return 如果兩個(gè)數(shù)一樣則返回0,如果第一個(gè)數(shù)比第二個(gè)數(shù)大則返回1,反之返回-1
*/
public static int compareTo(double v1,double v2){
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.compareTo(b2);
}
/**
* 格式化double
* @param arg0
* @param num
* @return
*/
public static String doubleFormat(double arg0,Integer num){
DecimalFormat df = new DecimalFormat("####.00");
/*DecimalFormat df2 = new DecimalFormat("##.00%");
DecimalFormat df3 = new DecimalFormat("###,##0.00");*/
if(num !=null){
if(num == 1){
df = new DecimalFormat("####.0");
}else if(num == 2){
df = new DecimalFormat("####.00");
}else if(num == 3){
df = new DecimalFormat("####.000");
}else if(num == 4){
df = new DecimalFormat("####.0000");
}
}else{
df = new DecimalFormat("####");
}
if(df.format(arg0).contains(".")){
if(df.format(arg0).substring(0, df.format(arg0).indexOf(".")).length()<=0){
df = new DecimalFormat("0.00");
if(num !=null){
if(num == 1){
df = new DecimalFormat("0.0");
}else if(num == 2){
df = new DecimalFormat("0.00");
}else if(num == 3){
df = new DecimalFormat("0.000");
}else if(num == 4){
df = new DecimalFormat("0.0000");
}
}else{
df = new DecimalFormat("0");
}
}
}
return df.format(arg0);
}
/**
* 百分比格式化
* @param arg0
* @param num
* @return
*/
public static String percentageFormat(double arg0,Integer num){
DecimalFormat df = new DecimalFormat("##.00%");
if(num !=null){
if(num == 1){
df = new DecimalFormat("####.0%");
}else if(num == 2){
df = new DecimalFormat("####.00%");
}else if(num == 3){
df = new DecimalFormat("####.000%");
}else if(num == 4){
df = new DecimalFormat("####.0000%");
}
}else{
df = new DecimalFormat("####%");
}
if(df.format(arg0).contains(".")){
if(df.format(arg0).substring(0, df.format(arg0).indexOf(".")).length()<=0){
df = new DecimalFormat("0.00%");
if(num !=null){
if(num == 1){
df = new DecimalFormat("0.0%");
}else if(num == 2){
df = new DecimalFormat("0.00%");
}else if(num == 3){
df = new DecimalFormat("0.000%");
}else if(num == 4){
df = new DecimalFormat("0.0000%");
}
}else{
df = new DecimalFormat("0%");
}
}
}
return df.format(arg0);
}
/**
* double每三位短號(hào)分割
* @param arg0
* @param num
* @return
*/
public static String splitNumberFormat(double arg0,Integer num){
DecimalFormat df = new DecimalFormat("###,##0.00");
if(num !=null){
if(num == 1){
df = new DecimalFormat("###,##0.0");
}else if(num == 2){
df = new DecimalFormat("###,##0.00");
}else if(num == 3){
df = new DecimalFormat("###,##0.000");
}else if(num == 4){
df = new DecimalFormat("###,##0.0000");
}
}else{
df = new DecimalFormat("###,###");
}
return df.format(arg0);
}
}