XMathUtil 工具類: BigDecimal 類型 計算公式大全!!!

BigDecimal 計算工具類

/**
 * @Author: wangmx
 * @title 數學計算工具類
 * @description 提供常用的數值加減乘除計算 , 及多個數值的求和 , 平均值 , 最大最小值計算
 */
public class XMathUtil {

    /** 默認的除法精確度 */
    private static final int DEF_DIV_SCALE = 2;

    /**
     * 精確加法運算
     * @param v1 被加數
     * @param v2 加數
     * @return 兩個參數的和(BigDecimal)
     */
    public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
        if (null == v1) {
            v1 = BigDecimal.ZERO;
        }
        if (null == v2) {
            v2 = BigDecimal.ZERO;
        }
        return v1.add(v2);
    }

    /**
     * 精確減法運算
     * @param v1 被減數
     * @param v2 減數
     * @return 兩個參數的差(BigDecimal)
     */
    public static BigDecimal subtract(BigDecimal v1, BigDecimal v2) {
        if (null == v1) {
            v1 = BigDecimal.ZERO;
        }
        if (null == v2) {
            v2 = BigDecimal.ZERO;
        }
        return v1.subtract(v2);
    }

    /**
     * 精確乘法運算
     * @param v1 被乘數
     * @param v2 乘數
     * @return 兩個參數的積(BigDecimal)
     */
    public static BigDecimal multiply(BigDecimal v1, BigDecimal v2) {
        if (null == v1) {
            v1 = BigDecimal.ZERO;
        }
        if (null == v2) {
            v2 = BigDecimal.ZERO;
        }
        return v1.multiply(v2);
    }

    /**
     * ( 相對 )精確除法運算 , 當發生除不盡情況時 , 精確到 小數點以後2位 , 以後數字四捨五入
     * @param v1 被除數
     * @param v2 除數
     * @return 兩個參數的商(BigDecimal)
     */
    public static BigDecimal divide(BigDecimal v1, BigDecimal v2) {
        if(v2.compareTo(BigDecimal.ZERO) == 0)return new BigDecimal(0);
        return v1.divide(v2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * ( 相對 )精確除法運算 . 當發生除不盡情況時 , 由scale參數指 定精度 , 以後數字四捨五入
     * @param v1 被除數
     * @param v2 除數
     * @param scale 表示表示需要精確到小數點以後幾位
     * @return 兩個參數的商(BigDecimal)
     */
    public static BigDecimal divide(BigDecimal v1, BigDecimal v2, Integer scale) {
        if (null == v1) {
            return BigDecimal.ZERO;
        }
        if (null == v2) {
            v2 = BigDecimal.ONE;
        }

        if (v2.compareTo(BigDecimal.ZERO) == 0) {
            return new BigDecimal(0);
            //throw new IllegalArgumentException("除數不能爲0");
        }

        if (scale < 0) {
            throw new IllegalArgumentException("精確度不能小於0");
        }

        return v1.divide(v2, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 精確加法運算 , 計算多個數值總和 , 若其中有null值則忽略
     * @param valList 被加數集合
     * @return 兩個參數的和(BigDecimal)
     */
    public static BigDecimal sum(BigDecimal v1, BigDecimal... valList) {
        if (null == v1) {
            v1 = BigDecimal.ZERO;
        }
        if (null == valList || valList.length == 0) {
            return v1;
        }
        for (BigDecimal val : valList) {
            if (null != val) {
                v1 = v1.add(val);
            }
        }
        return v1;
    }


    /**
     * 平均數
     * @param valList
     * @return
     */
    public static BigDecimal avg(BigDecimal... valList) {
        if (null != valList && valList.length != 0) {
            return divide(sum(BigDecimal.ZERO, valList), new BigDecimal(valList.length));
        }
        return BigDecimal.ZERO;
    }


    /**
     * 最大值
     * @param v1
     * @param valList
     * @return
     */
    public static BigDecimal max(BigDecimal v1, BigDecimal... valList) {
        BigDecimal max = v1;
        if (null == valList || valList.length == 0) {
            return max;
        }
        for (BigDecimal val : valList) {
            if (null != val && val.compareTo(max) > 0) {
                max = val;
            }
        }
        return max;
    }

    /**
     * 最大值
     * @param valList
     * @return
     */
    public static BigDecimal maxArr(BigDecimal... valList) {
        if (null == valList || valList.length == 0) {
            return null;
        }

        return max(valList[0], valList);
    }

    /**
     * 最小值
     * @param v1
     * @param valList
     * @return
     */
    public static BigDecimal min(BigDecimal v1, BigDecimal... valList) {
        BigDecimal min = v1;
        if (null == valList || valList.length == 0) {
            return min;
        }
        for (BigDecimal val : valList) {
            if (null != val && val.compareTo(min) < 0) {
                min = val;
            }
        }
        return min;
    }

    /**
     * 最小值
     * @param valList
     * @return
     */
    public static BigDecimal minArr(BigDecimal... valList) {
        if (null == valList || valList.length == 0) {
            return null;
        }
        return min(valList[0], valList);
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章