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;
}
}
BigDecimal 常用工具方法
最新推荐文章于 2024-04-16 19:55:05 发布