1. 程式人生 > >我只是一個簡單的Coder,為了興趣和理想奮鬥在生活的道路上

我只是一個簡單的Coder,為了興趣和理想奮鬥在生活的道路上

BigDecimal類


BigDecimal的加減乘除

import java.math.BigDecimal; 
public class Arith { 
/** 
* 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精 
* 確的浮點數運算,包括加減乘除和四捨五入。 
*/ 
//預設除法運算精度 
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 b1.divide(b2,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(); 
    } 
    
   /** 
    * 提供精確的型別轉換(Float) 
    * @param v 需要被轉換的數字 
    * @return 返回轉換結果 
    */ 
    public static float convertsToFloat(double v){ 
    BigDecimal b = new BigDecimal(v); 
    return b.floatValue(); 
    } 
    
    /** 
* 提供精確的型別轉換(Int)不進行四捨五入 
* @param v 需要被轉換的數字 
* @return 返回轉換結果 
*/ 
public static int convertsToInt(double v){ 
BigDecimal b = new BigDecimal(v); 
    return b.intValue(); 
} 
/** 
* 提供精確的型別轉換(Long) 
* @param v 需要被轉換的數字 
* @return 返回轉換結果 
*/ 
public static long convertsToLong(double v){ 
BigDecimal b = new BigDecimal(v); 
    return b.longValue(); 
} 
/** 
* 返回兩個數中大的一個值 
* @param v1 需要被對比的第一個數 
* @param v2 需要被對比的第二個數 
* @return 返回兩個數中大的一個值 
*/ 
public static double returnMax(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.max(b2).doubleValue(); 
} 
/** 
* 返回兩個數中小的一個值 
* @param v1 需要被對比的第一個數 
* @param v2 需要被對比的第二個數 
* @return 返回兩個數中小的一個值 
*/ 
public static double returnMin(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.min(b2).doubleValue(); 
} 
/** 
* 精確對比兩個數字 
* @param v1 需要被對比的第一個數 
* @param v2 需要被對比的第二個數 
* @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1 
*/ 
public static int compareTo(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.compareTo(b2); 
} 

} 

BigDecimal小數點處理

BigDecimal.setScale()方法用於格式化小數點
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則向下舍
註釋: 1:scale指的是你小數點後的位數。比如123.456則score就是3. score()就是BigDecimal類中的方法啊。
比如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.
2:roundingMode是小數的保留模式。它們都是BigDecimal中的常量欄位,有很多種。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal物件除以divisor後的結果,並且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊還是其它的,你可以自己選!

4:對於一般add、subtract、multiply方法的小數位格式化如下:

BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("mData=" + mData);
----結果:----- mData=9.66