public class MathUtils {

    private static final int DEF_DIV_SCALE = 32;

    /**
     * 转为BigDecimal
     *
     * @param obj
     */
    public static BigDecimal toBigDecimal(Object obj) {
        String str = String.valueOf(obj);
        return stringToBigDecimal(str);
    }

    /**
     * 字符串转为BigDecimal
     *
     * @param str
     */
    public static BigDecimal stringToBigDecimal(String str) {
        if (StringTool.isNull(str)) {
            str = "0";
        }
        return new BigDecimal(str);
    }

    /**
     * BigDecimal数值相加
     *
     * @param bigDecimals
     * @return
     */
    public static BigDecimal add(BigDecimal... bigDecimals) {
        BigDecimal bigDecimal = new BigDecimal(0);
        for (BigDecimal decimal : bigDecimals) {
            bigDecimal = bigDecimal.add(decimal);
        }
        return bigDecimal;
    }

    /**
     * 任何类型数值相加
     *
     * @param objects
     * @return
     */
    public static BigDecimal add(Object... objects) {
        int arrayLength = objects.length;
        String[] stringArray = new String[arrayLength];
        for (int i = 0; i < arrayLength; i++) {
            stringArray[i] = String.valueOf(objects[i]);
        }
        return add(stringArray);
    }

    /**
     * 字符串形式的数值相加
     *
     * @param strs
     * @return
     */
    public static BigDecimal add(String... strs) {
        BigDecimal bigDecimal = new BigDecimal(0);
        for (String str : strs) {
            bigDecimal = bigDecimal.add(stringToBigDecimal(str));
        }
        return bigDecimal;
    }

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

    /**
     * 相减
     *
     * @return
     */
    public static BigDecimal subtract(String... strs) {
        BigDecimal str0 = new BigDecimal(strs[0]);
        for (int i = 1; i < strs.length; i++) {
            str0 = str0.subtract(stringToBigDecimal(strs[i]));
        }
        return str0;
    }

    /**
     * BigDecimal类型两数相除
     *
     * @param bigDecimal1 除数
     * @param bigDecimal2 被除数
     * @return
     */
    public static BigDecimal divide(BigDecimal bigDecimal1, BigDecimal bigDecimal2) {
        return bigDecimal1.divide(bigDecimal2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * BigDecimal类型和int类型两数相除
     *
     * @param bigDecimal
     * @param number
     * @return
     */
    public static BigDecimal divide(BigDecimal bigDecimal, int number) {
        return divide(bigDecimal, new BigDecimal(number));
    }

    /**
     * 字符串类型和int类型两数相除
     *
     * @param str    字符串类型和int类型两数相除
     * @param number
     * @return
     */
    public static BigDecimal divide(String str, int number) {
        if (str.isEmpty()) {
            str = "0";
        }
        return divide(stringToBigDecimal(str), number);
    }

    /**
     * BigDecimal类型两数相乘
     *
     * @param bigDecimal1
     * @param bigDecimal2
     * @return
     */
    public static BigDecimal multiply(BigDecimal bigDecimal1, BigDecimal bigDecimal2) {
        return bigDecimal1.multiply(bigDecimal2);
    }

    /**
     * BigDecimal类型和int类型两数相乘
     *
     * @param bigDecimal1
     * @param number
     * @return
     */
    public static BigDecimal multiply(BigDecimal bigDecimal1, int number) {
        return multiply(bigDecimal1, new BigDecimal(number));
    }

    /**
     * 字符串类型和int类型两数相乘
     *
     * @param str
     * @param number
     * @return
     */
    public static BigDecimal multiply(String str, int number) {
        if (str.isEmpty()) {
            str = "0";
        }
        return multiply(stringToBigDecimal(str), number);
    }

    /**
     * 比较两个数的大小
     *
     * @param bg1 参数1
     * @param bg2 参数2
     * @return -1 bg1 < bg2;0 bg1 = bg2;1 bg1 > bg2
     */
    public static int compare(BigDecimal bg1, BigDecimal bg2) {
        return bg1.compareTo(bg2);
    }

    /**
     * 比较两个字符串形式数的大小
     *
     * @param str1 参数1
     * @param str2 参数2
     * @return -1 bg1 < bg2;0 bg1 = bg2;1 bg1 > bg2
     */
    public static int compare(String str1, String str2) {
        return compare(stringToBigDecimal(str1), stringToBigDecimal(str2));
    }

    /**
     * 获取日利息(根据利率和天数计算日利息,金额*利率/100/365*天数)
     *
     * @param amount       金额
     * @param interestRate 利率 (百分制)
     * @return 日利息
     */
    public static BigDecimal getDailyInterest(BigDecimal amount, BigDecimal interestRate) {
        BigDecimal interest = MathUtils.divide(MathUtils.multiply(amount, interestRate), 100); //年利息=金额*利率/100
        BigDecimal dailyInterest = MathUtils.divide(interest, 365); //日利息=年利息/365
        return dailyInterest;
    }

    /**
     * 获取利息
     *
     * @param amount       金额
     * @param interestRate 利率 (百分制)
     * @param days         天数
     * @return 利息
     */
    public static BigDecimal getInterest(BigDecimal amount, BigDecimal interestRate, int days) {
        BigDecimal interest = MathUtils.multiply(getDailyInterest(amount, interestRate), days); //日利息*天数
        return interest;
    }

}