All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dxy.library.util.common.MathUtils Maven / Gradle / Ivy

package com.dxy.library.util.common;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;

import java.math.BigDecimal;
import java.util.Random;

/**
 * 数字工具类
 * 提供精确的浮点数运算,包括加减乘除和四舍五入。
 * @author duanxinyuan
 * 2016/6/14 14:44
 */
public interface MathUtils {

    //除法运算的默认精度
    int DEF_DIV_SCALE = 10;

    /**
     * 判断Integer是否不为空和0
     * @return true-不为空和0
     */
    static boolean isNNZ(Integer i) {
        return null != i && i != 0;
    }

    /**
     * 判断Double是否为0
     * @return true-不为空和0
     */
    static boolean isNNZ(Double d) {
        return null != d && d != 0;
    }

    /**
     * 判断Long是否为0
     * @return true-不为空和0
     */
    static boolean isNNZ(Long l) {
        return null != l && l != 0;
    }

    /**
     * 判断Long是否为0
     * @return true-不为空和0
     */
    static boolean isNNZ(BigDecimal b) {
        return null != b && b.doubleValue() != 0;
    }

    /**
     * 判断Integer是否大于0
     * @return true-大于0
     */
    static boolean isGTZ(Integer i) {
        return null != i && i > 0;
    }

    /**
     * 判断Double是否大于0
     * @return true-大于0
     */
    static boolean isGTZ(Double d) {
        return null != d && d > 0;
    }

    /**
     * 判断Long是否大于0
     * @return true-大于0
     */
    static boolean isGTZ(Long l) {
        return null != l && l > 0;
    }

    /**
     * 判断Long是否大于0
     * @return true-大于0
     */
    static boolean isGTZ(BigDecimal b) {
        return null != b && b.doubleValue() > 0;
    }

    /**
     * 判断Integer是否小于0
     * @return true-大于0
     */
    static boolean isLTZ(Integer i) {
        return null != i && i < 0;
    }

    /**
     * 判断Double是否小于0
     * @return true-大于0
     */
    static boolean isLTZ(Double d) {
        return null != d && d < 0;
    }

    /**
     * 判断Long是否小于0
     * @return true-大于0
     */
    static boolean isLTZ(Long l) {
        return null != l && l < 0;
    }

    /**
     * 判断Long是否小于0
     * @return true-大于0
     */
    static boolean isLTZ(BigDecimal b) {
        return null != b && b.doubleValue() < 0;
    }

    /**
     * 加法运算
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    static double add(Number v1, Number v2) {
        v1 = v1 == null ? 0 : v1;
        v2 = v2 == null ? 0 : v2;
        return round(new BigDecimal(String.valueOf(v1)).add(new BigDecimal(String.valueOf(v2))).doubleValue());
    }

    /**
     * 加法运算
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    static double add(Number v1, Number... v2) {
        v1 = v1 == null ? 0 : v1;
        BigDecimal bigDecimal = new BigDecimal(String.valueOf(v1));
        for (Number number : v2) {
            if (number != null) {
                bigDecimal = bigDecimal.add(new BigDecimal(String.valueOf(number)));
            }
        }
        return round(bigDecimal.doubleValue());
    }

    /**
     * 减法运算
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    static double subtract(Number v1, Number v2) {
        v1 = v1 == null ? 0 : v1;
        v2 = v2 == null ? 0 : v2;
        return round(new BigDecimal(String.valueOf(v1)).subtract(new BigDecimal(String.valueOf(v2))).doubleValue());
    }

    /**
     * 减法运算
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    static double subtract(Number v1, Number... v2) {
        v1 = v1 == null ? 0 : v1;
        BigDecimal bigDecimal = new BigDecimal(String.valueOf(v1));
        for (Number number : v2) {
            if (number != null) {
                bigDecimal = bigDecimal.subtract(new BigDecimal(String.valueOf(number)));
            }
        }
        return round(bigDecimal.doubleValue());
    }

    /**
     * 乘法运算
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    static double multiply(Number v1, Number v2) {
        if (null == v1 || null == v2) {
            return 0;
        }
        return round(new BigDecimal(String.valueOf(v1)).multiply(new BigDecimal(String.valueOf(v2))).doubleValue());
    }

    /**
     * 乘法运算
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    static double multiply(Number v1, Number... v2) {
        v1 = v1 == null ? 0 : v1;
        BigDecimal bigDecimal = new BigDecimal(String.valueOf(v1));
        for (Number number : v2) {
            if (number != null) {
                bigDecimal = bigDecimal.multiply(new BigDecimal(String.valueOf(number)));
            }
        }
        return round(bigDecimal.doubleValue());
    }

    /**
     * 除法运算
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    static double divide(Number v1, Number v2) {
        return divide(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 除法运算
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    static double divide(Number v1, Number... v2) {
        v1 = v1 == null ? 0 : v1;
        BigDecimal bigDecimal = new BigDecimal(String.valueOf(v1));
        for (Number number : v2) {
            if (number != null) {
                bigDecimal = bigDecimal.divide(new BigDecimal(String.valueOf(number)), DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
            }
        }
        return round(bigDecimal.doubleValue());
    }

    /**
     * 除法运算
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    static double divide(Number v1, Number v2, int scale) {
        if (null == v1 || null == v2) {
            return 0;
        }
        if (scale < 0) {
            throw new IllegalArgumentException("保留小数位数不能小于0");
        }
        return round(new BigDecimal(String.valueOf(v1)).divide(new BigDecimal(String.valueOf(v2)), scale, BigDecimal.ROUND_HALF_UP).doubleValue());
    }

    /**
     * 保留两位小数,四舍五入
     */
    static double round(String v) {
        return round(v, 2);
    }

    /**
     * 保留两位小数,四舍五入
     */
    static double round(Number v) {
        return round(v, 2);
    }

    /**
     * 四舍五入
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    static double round(Number v, int scale) {
        if (null == v) {
            return 0;
        }
        return round(String.valueOf(v), scale);
    }

    /**
     * 四舍五入
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    static double round(String v, int scale) {
        if (org.apache.commons.lang3.StringUtils.isEmpty(v)) {
            return 0;
        }
        if (scale < 0) {
            throw new IllegalArgumentException("保留小数位数不能小于0");
        }
        BigDecimal b = new BigDecimal(v);
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 四舍五入取整
     */
    static int roundInt(String v) {
        if (StringUtils.isEmpty(v)) {
            return 0;
        }
        BigDecimal b = new BigDecimal(v);
        return b.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
    }

    /**
     * 四舍五入取整
     */
    static int roundInt(Number v) {
        return roundInt(String.valueOf(v));
    }

    /**
     * 比较大小
     * @return 返回l1是否比l2大, l1>l2返回true,l1 l2);
    }

    /**
     * 比较大小
     * @return i1, l1>i2返回true,i1 i2);
    }

    /**
     * 比较大小
     * @return 返回b1是否比b2大, b1>b2返回true,b1 0;
    }

    /**
     * 比较大小
     * @return 返回b1是否比b2大, b1>b2返回true,b1 end) {
            throw new IllegalArgumentException("随机数范围错误");
        }
        Random random = new Random();
        int fraction = random.nextInt(end - start);
        return start + fraction;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy