自己封装的一些算数工具方法

工作中计算的比较多,自己封装了一些工具方法,感觉还是挺好用的。

package com.yunmeng.iot.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * 计算常用工具类
 *
 * @author Linzj
 * @date 2023/3/18/018 16:22
 */
public class MathUtil {

    /**
     * 判断参数是否为0
     *
     * @param num 参数
     * @return 0返回true,反之返回false
     */
    private static boolean isZero(BigDecimal num) {
        return num.compareTo(BigDecimal.ZERO) == 0;
    }


    /**
     * 除法工具方法
     * 有时候用 BigDecimal 除法,被除数是0会/by zero,或者除数是0除了也是0
     *
     * @param divisor  除数
     * @param dividend 被除数
     * @return 结果,四舍五入两位小数
     */
    public static BigDecimal divide(BigDecimal divisor, BigDecimal dividend) {
        if (Objects.isNull(divisor) || Objects.isNull(dividend)) {
            return BigDecimal.ZERO;
        }
        if (isZero(dividend) || isZero(divisor)) {
            return BigDecimal.ZERO;
        }
        return divisor.divide(dividend, 2, RoundingMode.HALF_UP);
    }

    /**
     * 除法工具方法
     * 有时候用 BigDecimal 除法,被除数是0会/by zero,或者除数是0除了也是0
     *
     * @param divisor  除数
     * @param dividend 被除数
     * @return 结果,四舍五入两位小数
     */
    public static BigDecimal divide(BigDecimal divisor, BigDecimal dividend, int scale, RoundingMode roundingMode) {
        if (Objects.isNull(divisor) || Objects.isNull(dividend)) {
            return BigDecimal.ZERO;
        }
        if (isZero(dividend) || isZero(divisor)) {
            return BigDecimal.ZERO;
        }
        return divisor.divide(dividend, scale, roundingMode);
    }


    /**
     * 计算百分比 (保留两位小数)
     *
     * @param divisor  除数
     * @param dividend 被除数
     * @return 百分比
     */
    public static String percentage(BigDecimal divisor, BigDecimal dividend) {
        if (isZero(dividend) || isZero(divisor)) {
            return "0%";
        }
        // 计算百分比
        return divisor.divide(dividend, 4, RoundingMode.HALF_UP)
                .multiply(BigDecimal.valueOf(100))
                .setScale(2, RoundingMode.HALF_UP)
                .toPlainString() + "%";
    }

    /**
     * 统计数量
     */
    public static <T> Long count(Predicate<? super T> predicate, List<T> list) {
        return list.stream()
                .filter(predicate)
                .count();
    }

    /**
     * BigDecimal类型求和
     */
    public static <T> BigDecimal sumBigDecimal(Function<? super T, BigDecimal> function, List<T> list) {
        return list.stream()
                .map(function)
                .filter(Objects::nonNull)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }

    /**
     * Long类型求和
     */
    public static <T> Long sumLong(Function<? super T, Long> function, List<T> list) {
        return list.stream()
                .map(function)
                .filter(Objects::nonNull)
                .reduce(0L, Long::sum);
    }
}
posted @ 2023-10-21 11:29  Kllin  阅读(10)  评论(0编辑  收藏  举报