package com.mini.capi.utils;


import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalUtils {


    /**
     * 加法运算
     *
     * @param num1 第一个数
     * @param num2 第二个数
     * @return 两数之和
     */
    public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
        // 避免空指针，默认空值为 0
        if (num1 == null) {
            num1 = BigDecimal.ZERO;
        }
        if (num2 == null) {
            num2 = BigDecimal.ZERO;
        }
        return num1.add(num2);
    }

    /**
     * 减法运算
     *
     * @param num1 被减数
     * @param num2 减数
     * @return 两数之差（num1 - num2）
     */
    public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
        if (num1 == null) {
            num1 = BigDecimal.ZERO;
        }
        if (num2 == null) {
            num2 = BigDecimal.ZERO;
        }
        return num1.subtract(num2);
    }

    /**
     * 乘法运算
     *
     * @param num1 第一个数
     * @param num2 第二个数
     * @return 两数之积
     */
    public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
        if (num1 == null || num2 == null) {
            return BigDecimal.ZERO;
        }
        return num1.multiply(num2);
    }

    /**
     * 除法运算（处理除不尽的情况，默认保留2位小数，四舍五入）
     *
     * @param num1 被除数
     * @param num2 除数
     * @return 两数之商（num1 / num2）
     */
    public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
        return divide(num1, num2, 2, RoundingMode.HALF_UP);
    }

    /**
     * 除法运算（自定义精度和舍入模式）
     *
     * @param num1         被除数
     * @param num2         除数
     * @param scale        保留小数位数
     * @param roundingMode 舍入模式（如四舍五入、向上取整等）
     * @return 两数之商（num1 / num2）
     */
    public static BigDecimal divide(BigDecimal num1, BigDecimal num2, int scale, RoundingMode roundingMode) {
        if (num1 == null) {
            return BigDecimal.ZERO;
        }
        if (num2 == null || num2.compareTo(BigDecimal.ZERO) == 0) {
            throw new ArithmeticException("除数不能为 null 或 0");
        }
        // 注意：divide 方法必须指定精度和舍入模式，否则除不尽时会抛异常
        return num1.divide(num2, scale, roundingMode);
    }

}
