文件位置
import com.np.pm.utils.NumberUtil;
1.数字转Bigdecimal,对象为空返回0
/**
* 如果为空返回0,否则返回本身
*
* @param obj
* @return
*/
public static BigDecimal ifNullReturnZero(Object obj) {
return obj != null ? new BigDecimal(obj + "") : BigDecimal.ZERO;
}
2.计算比例,默认4位,进位规则默认四舍五入
/**
* @param val1 被除数
* @param val2 除数
* @param scale 精度(小数点后多少位)
* @param roundingMode 进位方式
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 计算百分比
* @date 2020/3/10 17:24
*/
public static BigDecimal percentage(Object val1, Object val2, int scale, int roundingMode) {
BigDecimal dividend = ifNullReturnZero(val1);
BigDecimal divisor = ifNullReturnZero(val2);
if (divisor.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal result = dividend.divide(divisor, scale, roundingMode);
result = result.multiply(new BigDecimal(100));
return result;
} else {
return BigDecimal.ZERO;
}
}
/**
* @param val1 被除数
* @param val2 除数
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 计算百分比
* @date 2020/3/10 17:24
*/
public static BigDecimal percentage(Object val1, Object val2) {
return percentage(val1, val2, 4, BigDecimal.ROUND_HALF_UP);
}
示例:
public static void main(String[] args) {
String num1 = "165.23";
String num2 = "2000.68789";
System.out.println(percentage(num1,num2));
}
结果
8.2600
Process finished with exit code 0
3.计算不含税金额,默认6位,进位规则默认四舍五入
/**
* 计算金额不含税
*
* @param money 金额
* @param rate 税率
* @return
*/
public static BigDecimal noTax(Object money, Object rate) {
return noTax(money, rate, 6, BigDecimal.ROUND_HALF_UP);
}
/**
* 计算金额不含税
*
* @param money 金额
* @param rate 税率
* @return
*/
public static BigDecimal noTax(Object money, Object rate, int scale, int roundingMode) {
BigDecimal val1 = ifNullReturnZero(money);
BigDecimal val2 = ifNullReturnZero(rate);
return val1
.divide(val2.multiply(new BigDecimal(0.01)).add(BigDecimal.ONE), scale, roundingMode);
}
示例
public static void main(String[] args) {
String money = "2551.23146";
String rate = "61.62";
System.out.println(noTax(money, rate));
}
结果
1578.536976
Process finished with exit code 0
4.数据相加,add()方法默认保留2位,addNotPrecision()不含精度
/**
* @param val1
* @param val2
* @param scale 精度(小数点后多少位)
* @param roundingMode 进位方式
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相加
* @date 2020/3/10 17:24
*/
public static BigDecimal add(Object val1, Object val2, int scale, int roundingMode) {
BigDecimal num1 = val1 != null ? new BigDecimal(val1.toString()) : BigDecimal.ZERO;
BigDecimal num2 = val2 != null ? new BigDecimal(val2.toString()) : BigDecimal.ZERO;
BigDecimal result = num1.add(num2).setScale(scale, roundingMode);
return result;
}
/**
* @param val1
* @param val2
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相加
* @date 2020/3/10 17:24
*/
public static BigDecimal add(Object val1, Object val2) {
return add(val1, val2, 2, BigDecimal.ROUND_HALF_UP);
}
/**
* @param val1
* @param val2
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相加
* @date 2020/3/10 17:24
*/
public static BigDecimal addNotPrecision(Object val1, Object val2) {
BigDecimal num1 = ifNullReturnZero(val1);
BigDecimal num2 = ifNullReturnZero(val2);
return num1.add(num2);
}
/**
* @param vals
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相加
* @date 2020/3/10 17:24
*/
public static BigDecimal addNotPrecision(Object... vals) {
BigDecimal result = BigDecimal.ZERO;
for (Object val : vals) {
BigDecimal num = ifNullReturnZero(val);
result = result.add(num);
}
return result;
}
示例
public static void main(String[] args) {
String num1 = "2551.23146";
String num2 = "61.62";
System.out.println(add(num1, num2));
System.out.println(addNotPrecision(num1, num2));
}
结果
2612.85
2612.85146
Process finished with exit code 0
5.数据相减
/**
* @param val1 被减数
* @param val2 减数
* @param scale 精度(小数点后多少位)
* @param roundingMode 进位方式
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相减
* @date 2020/3/11 9:40
*/
public static BigDecimal subtract(Object val1, Object val2, int scale, int roundingMode) {
BigDecimal num1 = ifNullReturnZero(val1);
BigDecimal num2 = ifNullReturnZero(val2);
return num1.subtract(num2).setScale(scale, roundingMode);
}
/**
* @param val1 被减数
* @param val2 减数
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相减
* @date 2020/3/11 9:40
*/
public static BigDecimal subtract(Object val1, Object val2) {
return subtract(val1, val2, 2, BigDecimal.ROUND_HALF_UP);
}
/**
* @param val1
* @param val2
* @return java.math.BigDecimal
* @author 汤星鹏
* @Description 相减
* @date 2020/3/10 17:24
*/
public static BigDecimal subtractNotPrecision(Object val1, Object val2) {
BigDecimal num1 = ifNullReturnZero(val1);
BigDecimal num2 = ifNullReturnZero(val2);
return num1.subtract(num2);
}
示例
public static void main(String[] args) {
String num1 = "2551.23146";
String num2 = "61.62";
System.out.println(subtract(num1, num2));
System.out.println(subtractNotPrecision(num1, num2));
}
结果
2489.61
2489.61146
Process finished with exit code 0
6.数据相除,默认保留2位,四舍五入,除数为0返回0
/**
* @param val1 被除数
* @param val2 除数
* @return java.math.BigDecimal
* @Description 相除
* @date 2020/3/11 9:40
*/
public static BigDecimal divide(Object val1, Object val2, int scale, int roundingMode) {
BigDecimal num1 = new BigDecimal(val1.toString());
BigDecimal num2 = new BigDecimal(val2.toString());
if (num2.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal result = num1.divide(num2, scale, roundingMode);
return result;
} else {
return BigDecimal.ZERO;
}
}
/**
* @param val1 被除数
* @param val2 除数
* @return java.math.BigDecimal
* @Description 相除
* @date 2020/3/11 9:40
*/
public static BigDecimal divide(Object val1, Object val2) {
return divide(val1, val2, 2, BigDecimal.ROUND_HALF_UP);
}
示例
public static void main(String[] args) {
String num1 = "2551.23146";
String num2 = "61.62";
System.out.println(divide(num1, num2));
num1 = "0";
System.out.println(divide(num1, num2));
}
结果
41.40
0.00
Process finished with exit code 0
7.集合相加
/**
* 集合相加
*
* @param list 集合
* @param fun get方法
* @return
*/
public static <T, R> BigDecimal listAdd(List<T> list, Function<T, R> fun) {
BigDecimal result = BigDecimal.ZERO;
if (ListUtil.notEmpty(list)) {
for (T l : list) {
R obj = fun.apply(l);
result = NumberUtil.addNotPrecision(result, obj);
}
}
return result;
}
/**
* 集合相加
*
* @param list 集合
* @return
*/
public static <T, R> BigDecimal listAddBigDicimal(List<BigDecimal> list) {
BigDecimal result = BigDecimal.ZERO;
if (ListUtil.notEmpty(list)) {
for (BigDecimal l : list) {
result = NumberUtil.addNotPrecision(result, l);
}
}
return result;
}
/**
* 集合相加
*
* @param list 集合
* @param funs get方法
* @return
*/
public static Map<Function, BigDecimal> listAddForFuns(List list, Function... funs) {
Map<Function, BigDecimal> map = new HashMap<>(funs.length);
List<Function> functions = Arrays.asList(funs);
functions.forEach(fun -> {
map.put(fun, BigDecimal.ZERO);
});
if (ListUtil.notEmpty(list)) {
for (Object l : list) {
functions.forEach(fun -> {
BigDecimal bigDecimal = map.get(fun);
bigDecimal = addNotPrecision(bigDecimal, fun.apply(l));
map.put(fun, bigDecimal);
});
}
}
return map;
}
示例
public static void main(String[] args) {
List<EngplanMonthProgressPay> list = new ArrayList<>(10);
for (int i = 0; i < 10; i++) {
EngplanMonthProgressPay data = new EngplanMonthProgressPay();
data.setNextPayMoney(RandomUtil.randomBigDecimal());
data.setPeriodApplyMoney(RandomUtil.randomBigDecimal());
list.add(data);
}
System.out.println(NumberUtil
.listAdd(list, EngplanMonthProgressPay::getNextPayMoney));
Function<EngplanMonthProgressPay, BigDecimal> getNextPayMoney =
EngplanMonthProgressPay::getNextPayMoney;
Function<EngplanMonthProgressPay, BigDecimal> getPeriodApplyMoney =
EngplanMonthProgressPay::getPeriodApplyMoney;
Map<Function, BigDecimal> functionBigDecimalMap =
NumberUtil.listAddForFuns(list, getNextPayMoney, getPeriodApplyMoney);
System.out.printf("getNextPayMoney:%s\n",
functionBigDecimalMap.get(getNextPayMoney));
System.out.printf("getPeriodApplyMoney:%s\n",
functionBigDecimalMap.get(getPeriodApplyMoney));
}
结果
5.63064854902908826
getNextPayMoney:5.63064854902908826
getPeriodApplyMoney:5.7725252826718517907
Process finished with exit code 0
8.map相加
/**
* map相加
*
* @param map map
* @param key 键值
* @param <K>
* @param <T>
* @return
*/
public static <K, T> BigDecimal addMap(Map<K, T> map, K... key) {
BigDecimal bigDecimal = BigDecimal.ZERO;
if (Objects.nonNull(map)) {
List<K> keys = ListUtil.notEmpty(key) ? Arrays.asList(key) : new ArrayList<>(map.keySet());
for (K k : keys) {
bigDecimal = NumberUtil.addNotPrecision(bigDecimal, map.get(k));
}
}
return bigDecimal;
}
示例
public static void main(String[] args) {
Map<Integer, BigDecimal> map = new HashMap<>(3);
map.put(1, new BigDecimal("147.53"));
map.put(2, new BigDecimal("465.579"));
map.put(3, new BigDecimal("-451.356"));
System.out.println(NumberUtil.addMap(map, 1, 2, 3));
}
结果
161.753
Process finished with exit code 0