BigDecimal 常用工具方法

该博客介绍了一个用于处理BigDecimal运算的工具类,包括加减乘除等基本操作,并提供了处理精度和异常的方法。类中定义了常量MIN_SCALE以设定最小精度,并使用RoundingMode.HALF_EVEN_MODE作为默认的精度处理方式,确保金融计算的准确性。此外,还包含了判断金额是否为0、为负或为空的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.bop.util;

import com.bop.exception.BaseException;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.Objects;
import java.util.function.BinaryOperator;

/**
 * BigDecimal 常用方法
 *
 * @author neal.armstrong
 * @version 1.0
 * @since 2021/6/16 17:45
 */
public final class BigDecimalUtil {
    private BigDecimalUtil() {
        throw new AssertionError("工具类 BigDecimalUtil 创建对象失败");
    }

    /**
     * 最小精度
     */
    private static final int MIN_SCALE = 6;

    /**
     * 精度处理算法,默认为银行家算法,四舍五入一般不适用与金融领域
     */
    private static final RoundingMode HALF_EVEN_MODE = RoundingMode.HALF_EVEN;

    /**
     * 精度为{@link BigDecimalUtil#MIN_SCALE},多金额汇总,不处理判空
     *
     * @param operator 操作方法
     * @param money    金额数组
     * @return 金额汇总
     */
    public static BigDecimal operateThrow(BinaryOperator<BigDecimal> operator, BigDecimal... money) {
        return Arrays.stream(money)
                .reduce(operator)
                .orElseThrow(() -> BaseException.serviceErr("BigDecimal 操作失败"));
    }

    /**
     * 多金额汇总,已判空处理
     *
     * @param operator 操作方法
     * @param money    金额数组
     * @return 金额汇总
     */
    public static BigDecimal operate(BinaryOperator<BigDecimal> operator, BigDecimal... money) {
        return Arrays.stream(money)
                .filter(Objects::nonNull)
                .reduce(operator)
                .orElse(BigDecimal.ZERO);
    }

    private static BinaryOperator<BigDecimal> divide(int scale) {
        return (x, y) -> x.divide(y, scale, HALF_EVEN_MODE);
    }

    private static BinaryOperator<BigDecimal> multiply() {
        return BigDecimal::multiply;
    }

    private static BinaryOperator<BigDecimal> subtract() {
        return BigDecimal::subtract;
    }

    private static BinaryOperator<BigDecimal> add() {
        return BigDecimal::add;
    }

    /**
     * 除法  请注意 被除数不能为0
     *
     * @param a 除数
     * @param b 被除数
     * @return 结果
     */
    public static BigDecimal divideThrow(BigDecimal a, BigDecimal b) {
        return operateThrow(divide(MIN_SCALE), a, b);
    }

    /**
     * 除法 请注意 被除数不能为0
     *
     * @param a 除数
     * @param b 被除数
     * @return 结果
     */
    public static BigDecimal divide(BigDecimal a, BigDecimal b) {
        return operate(divide(MIN_SCALE), a, b);
    }

    /**
     * 除法  请注意 被除数不能为0
     *
     * @param scale 精度
     * @param a     除数
     * @param b     被除数
     * @return 结果
     */
    public static BigDecimal divideThrow(int scale, BigDecimal a, BigDecimal b) {
        return operateThrow(divide(scale), a, b);
    }

    /**
     * 除法 请注意 被除数不能为0
     *
     * @param scale 精度
     * @param a     除数
     * @param b     被除数
     * @return 结果
     */
    public static BigDecimal divide(int scale, BigDecimal a, BigDecimal b) {
        return operate(divide(scale), a, b);
    }

    public static BigDecimal multiplyThrow(BigDecimal a, BigDecimal b) {
        return operateThrow(multiply(), a, b);
    }

    public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
        return operate(multiply(), a, b);
    }

    public static BigDecimal subtractThrow(BigDecimal a, BigDecimal b) {
        return operateThrow(subtract(), a, b);
    }

    public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
        return operate(subtract(), a, b);
    }

    public static BigDecimal addThrow(BigDecimal a, BigDecimal b) {
        return operateThrow(add(), a, b);
    }

    public static BigDecimal add(BigDecimal a, BigDecimal b) {
        return operate(add(), a, b);
    }

    /**
     * 未判空,判断 金额是否为 0
     *
     * @param source 金额
     * @return 为0
     */
    public static boolean isZero(BigDecimal source) {
        return BigDecimal.ZERO.compareTo(source) == 0;
    }

    /**
     * 判断 金额是否空或是否为0
     *
     * @param source 金额
     * @return 为空或等于0
     */
    public static boolean isNullOrZero(BigDecimal source) {
        return source == null || isZero(source);
    }

    /**
     * 判断金额是否为负
     *
     * @param source 金额
     * @return 金额为负
     */
    public static boolean isNegative(BigDecimal source) {
        return BigDecimal.ZERO.compareTo(source) > 0;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值