double型数据加减乘除工具类

发布时间 2023-10-30 11:28:02作者: 我的博客我的人生
public class DoubleUtil {

    /**
     * 很小的数值 用于double和0比较 存在尾差问题
     ***/
    private static final Double minVal = 0.00001;

    /**
     * 两个Double数相加
     *
     * @param v1
     * @param v2
     * @return
     */
    public static Double add(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.add(b2).doubleValue();
    }

    /**
     * 两个Double数相减
     *
     * @param v1
     * @param v2
     * @return
     */
    public static Double sub(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 两个Double数相乘
     *
     * @param v1
     * @param v2
     * @return
     */
    public static Double mul(Double v1, Double v2) {
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 两个Double数相乘,scale 小数位, 默认四舍五入的方式取整
     *
     * @param v1
     * @param v2
     * @return
     */
    public static Double mul(Double v1, Double v2, int scale) {
        if (v2 == 0) {
            return 0d;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 两个Double数相乘, scale 小数位
     *
     * @param v1
     * @param v2
     * @return
     */
    public static Double mul(Double v1, Double v2, int scale, int roundingMode) {
        if (v2 == 0) {
            return 0d;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.multiply(b2).setScale(scale, roundingMode).doubleValue();
    }

    /**
     * 两个Double数相除,并保留scale位小数,默认四舍五入的方式
     *
     * @param v1    除数
     * @param v2    被除数
     * @param scale
     * @return
     */
    public static Double div(Double v1, Double v2, int scale) {
        if (v2 == 0 || Math.abs(v2) < minVal) {
            return 0.0d;
        }
        return div(v1, v2, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 两个Double数相除,保留scale位小数,并且指定取舍类型
     *
     * @param v1           除数
     * @param v2           被除数
     * @param scale
     * @param roundingMode BigDecimal.ROUND_HALF_UP,
     *                     BigDecimal.ROUND_UP,BigDecimal.ROUND_DOWN...
     * @return
     */
    public static Double div(Double v1, Double v2, int scale, int roundingMode) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        if (v2 == 0 || Math.abs(v2) < minVal) {
            return 0.0d;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.divide(b2, scale, roundingMode).doubleValue();
    }

}