文件位置
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.2600Process 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.536976Process 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.852612.85146Process 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.612489.61146Process 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.400.00Process 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