文件位置

  1. import com.np.pm.utils.NumberUtil;

1.数字转Bigdecimal,对象为空返回0

  1. /**
  2. * 如果为空返回0,否则返回本身
  3. *
  4. * @param obj
  5. * @return
  6. */
  7. public static BigDecimal ifNullReturnZero(Object obj) {
  8. return obj != null ? new BigDecimal(obj + "") : BigDecimal.ZERO;
  9. }

2.计算比例,默认4位,进位规则默认四舍五入

  1. /**
  2. * @param val1 被除数
  3. * @param val2 除数
  4. * @param scale 精度(小数点后多少位)
  5. * @param roundingMode 进位方式
  6. * @return java.math.BigDecimal
  7. * @author 汤星鹏
  8. * @Description 计算百分比
  9. * @date 2020/3/10 17:24
  10. */
  11. public static BigDecimal percentage(Object val1, Object val2, int scale, int roundingMode) {
  12. BigDecimal dividend = ifNullReturnZero(val1);
  13. BigDecimal divisor = ifNullReturnZero(val2);
  14. if (divisor.compareTo(BigDecimal.ZERO) != 0) {
  15. BigDecimal result = dividend.divide(divisor, scale, roundingMode);
  16. result = result.multiply(new BigDecimal(100));
  17. return result;
  18. } else {
  19. return BigDecimal.ZERO;
  20. }
  21. }
  22. /**
  23. * @param val1 被除数
  24. * @param val2 除数
  25. * @return java.math.BigDecimal
  26. * @author 汤星鹏
  27. * @Description 计算百分比
  28. * @date 2020/3/10 17:24
  29. */
  30. public static BigDecimal percentage(Object val1, Object val2) {
  31. return percentage(val1, val2, 4, BigDecimal.ROUND_HALF_UP);
  32. }

示例:

  1. public static void main(String[] args) {
  2. String num1 = "165.23";
  3. String num2 = "2000.68789";
  4. System.out.println(percentage(num1,num2));
  5. }

结果

  1. 8.2600
  2. Process finished with exit code 0

3.计算不含税金额,默认6位,进位规则默认四舍五入

  1. /**
  2. * 计算金额不含税
  3. *
  4. * @param money 金额
  5. * @param rate 税率
  6. * @return
  7. */
  8. public static BigDecimal noTax(Object money, Object rate) {
  9. return noTax(money, rate, 6, BigDecimal.ROUND_HALF_UP);
  10. }
  11. /**
  12. * 计算金额不含税
  13. *
  14. * @param money 金额
  15. * @param rate 税率
  16. * @return
  17. */
  18. public static BigDecimal noTax(Object money, Object rate, int scale, int roundingMode) {
  19. BigDecimal val1 = ifNullReturnZero(money);
  20. BigDecimal val2 = ifNullReturnZero(rate);
  21. return val1
  22. .divide(val2.multiply(new BigDecimal(0.01)).add(BigDecimal.ONE), scale, roundingMode);
  23. }

示例

  1. public static void main(String[] args) {
  2. String money = "2551.23146";
  3. String rate = "61.62";
  4. System.out.println(noTax(money, rate));
  5. }

结果

  1. 1578.536976
  2. Process finished with exit code 0

4.数据相加,add()方法默认保留2位,addNotPrecision()不含精度

  1. /**
  2. * @param val1
  3. * @param val2
  4. * @param scale 精度(小数点后多少位)
  5. * @param roundingMode 进位方式
  6. * @return java.math.BigDecimal
  7. * @author 汤星鹏
  8. * @Description 相加
  9. * @date 2020/3/10 17:24
  10. */
  11. public static BigDecimal add(Object val1, Object val2, int scale, int roundingMode) {
  12. BigDecimal num1 = val1 != null ? new BigDecimal(val1.toString()) : BigDecimal.ZERO;
  13. BigDecimal num2 = val2 != null ? new BigDecimal(val2.toString()) : BigDecimal.ZERO;
  14. BigDecimal result = num1.add(num2).setScale(scale, roundingMode);
  15. return result;
  16. }
  17. /**
  18. * @param val1
  19. * @param val2
  20. * @return java.math.BigDecimal
  21. * @author 汤星鹏
  22. * @Description 相加
  23. * @date 2020/3/10 17:24
  24. */
  25. public static BigDecimal add(Object val1, Object val2) {
  26. return add(val1, val2, 2, BigDecimal.ROUND_HALF_UP);
  27. }
  28. /**
  29. * @param val1
  30. * @param val2
  31. * @return java.math.BigDecimal
  32. * @author 汤星鹏
  33. * @Description 相加
  34. * @date 2020/3/10 17:24
  35. */
  36. public static BigDecimal addNotPrecision(Object val1, Object val2) {
  37. BigDecimal num1 = ifNullReturnZero(val1);
  38. BigDecimal num2 = ifNullReturnZero(val2);
  39. return num1.add(num2);
  40. }
  41. /**
  42. * @param vals
  43. * @return java.math.BigDecimal
  44. * @author 汤星鹏
  45. * @Description 相加
  46. * @date 2020/3/10 17:24
  47. */
  48. public static BigDecimal addNotPrecision(Object... vals) {
  49. BigDecimal result = BigDecimal.ZERO;
  50. for (Object val : vals) {
  51. BigDecimal num = ifNullReturnZero(val);
  52. result = result.add(num);
  53. }
  54. return result;
  55. }

示例

  1. public static void main(String[] args) {
  2. String num1 = "2551.23146";
  3. String num2 = "61.62";
  4. System.out.println(add(num1, num2));
  5. System.out.println(addNotPrecision(num1, num2));
  6. }

结果

  1. 2612.85
  2. 2612.85146
  3. Process finished with exit code 0

5.数据相减

  1. /**
  2. * @param val1 被减数
  3. * @param val2 减数
  4. * @param scale 精度(小数点后多少位)
  5. * @param roundingMode 进位方式
  6. * @return java.math.BigDecimal
  7. * @author 汤星鹏
  8. * @Description 相减
  9. * @date 2020/3/11 9:40
  10. */
  11. public static BigDecimal subtract(Object val1, Object val2, int scale, int roundingMode) {
  12. BigDecimal num1 = ifNullReturnZero(val1);
  13. BigDecimal num2 = ifNullReturnZero(val2);
  14. return num1.subtract(num2).setScale(scale, roundingMode);
  15. }
  16. /**
  17. * @param val1 被减数
  18. * @param val2 减数
  19. * @return java.math.BigDecimal
  20. * @author 汤星鹏
  21. * @Description 相减
  22. * @date 2020/3/11 9:40
  23. */
  24. public static BigDecimal subtract(Object val1, Object val2) {
  25. return subtract(val1, val2, 2, BigDecimal.ROUND_HALF_UP);
  26. }
  27. /**
  28. * @param val1
  29. * @param val2
  30. * @return java.math.BigDecimal
  31. * @author 汤星鹏
  32. * @Description 相减
  33. * @date 2020/3/10 17:24
  34. */
  35. public static BigDecimal subtractNotPrecision(Object val1, Object val2) {
  36. BigDecimal num1 = ifNullReturnZero(val1);
  37. BigDecimal num2 = ifNullReturnZero(val2);
  38. return num1.subtract(num2);
  39. }

示例

  1. public static void main(String[] args) {
  2. String num1 = "2551.23146";
  3. String num2 = "61.62";
  4. System.out.println(subtract(num1, num2));
  5. System.out.println(subtractNotPrecision(num1, num2));
  6. }

结果

  1. 2489.61
  2. 2489.61146
  3. Process finished with exit code 0

6.数据相除,默认保留2位,四舍五入,除数为0返回0

  1. /**
  2. * @param val1 被除数
  3. * @param val2 除数
  4. * @return java.math.BigDecimal
  5. * @Description 相除
  6. * @date 2020/3/11 9:40
  7. */
  8. public static BigDecimal divide(Object val1, Object val2, int scale, int roundingMode) {
  9. BigDecimal num1 = new BigDecimal(val1.toString());
  10. BigDecimal num2 = new BigDecimal(val2.toString());
  11. if (num2.compareTo(BigDecimal.ZERO) != 0) {
  12. BigDecimal result = num1.divide(num2, scale, roundingMode);
  13. return result;
  14. } else {
  15. return BigDecimal.ZERO;
  16. }
  17. }
  18. /**
  19. * @param val1 被除数
  20. * @param val2 除数
  21. * @return java.math.BigDecimal
  22. * @Description 相除
  23. * @date 2020/3/11 9:40
  24. */
  25. public static BigDecimal divide(Object val1, Object val2) {
  26. return divide(val1, val2, 2, BigDecimal.ROUND_HALF_UP);
  27. }

示例

  1. public static void main(String[] args) {
  2. String num1 = "2551.23146";
  3. String num2 = "61.62";
  4. System.out.println(divide(num1, num2));
  5. num1 = "0";
  6. System.out.println(divide(num1, num2));
  7. }

结果

  1. 41.40
  2. 0.00
  3. Process finished with exit code 0

7.集合相加

  1. /**
  2. * 集合相加
  3. *
  4. * @param list 集合
  5. * @param fun get方法
  6. * @return
  7. */
  8. public static <T, R> BigDecimal listAdd(List<T> list, Function<T, R> fun) {
  9. BigDecimal result = BigDecimal.ZERO;
  10. if (ListUtil.notEmpty(list)) {
  11. for (T l : list) {
  12. R obj = fun.apply(l);
  13. result = NumberUtil.addNotPrecision(result, obj);
  14. }
  15. }
  16. return result;
  17. }
  18. /**
  19. * 集合相加
  20. *
  21. * @param list 集合
  22. * @return
  23. */
  24. public static <T, R> BigDecimal listAddBigDicimal(List<BigDecimal> list) {
  25. BigDecimal result = BigDecimal.ZERO;
  26. if (ListUtil.notEmpty(list)) {
  27. for (BigDecimal l : list) {
  28. result = NumberUtil.addNotPrecision(result, l);
  29. }
  30. }
  31. return result;
  32. }
  33. /**
  34. * 集合相加
  35. *
  36. * @param list 集合
  37. * @param funs get方法
  38. * @return
  39. */
  40. public static Map<Function, BigDecimal> listAddForFuns(List list, Function... funs) {
  41. Map<Function, BigDecimal> map = new HashMap<>(funs.length);
  42. List<Function> functions = Arrays.asList(funs);
  43. functions.forEach(fun -> {
  44. map.put(fun, BigDecimal.ZERO);
  45. });
  46. if (ListUtil.notEmpty(list)) {
  47. for (Object l : list) {
  48. functions.forEach(fun -> {
  49. BigDecimal bigDecimal = map.get(fun);
  50. bigDecimal = addNotPrecision(bigDecimal, fun.apply(l));
  51. map.put(fun, bigDecimal);
  52. });
  53. }
  54. }
  55. return map;
  56. }

示例

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