数据计算时使用的工具类

关注我,升职加薪就是你!
金融项目做多了,不可能每次遇到需要计算的,都要重新写工具类。由于这部分代码是公共的,就把它记录在这里吧,省的下次再写这些重复性的东西。如果对你们有帮助,你们也可以收藏保存下来。
话不多说,下面就直接上代码吧。

package com.demo.nacosprovider.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * @Author: Paul
 * @Date: 2021/10/28
 * @Function: 数值计算工具类
 */
public class BigDecimalUtils {

    private static Logger logger = LoggerFactory.getLogger(BigDecimalUtils.class);

    /**
     * 小数位默认取2位
     */
    private static final Integer DEFAULT_SCALE = 2;

    public static final BigDecimal BigDecimal_100 = new BigDecimal("100");

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 获取数值对象
     * @param: [value]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal getBigDecimal(Object value) {
        BigDecimal result = null;
        try {
            result = new BigDecimal(value.toString());
        } catch (Exception e) {
            logger.error("非法参数,无法转为Bigdecimal类型");
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 获取数值对象
     * @param: [value, defaultValue]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal getBigDecimal(Object value, Number defaultValue) {
        BigDecimal result = null;
        try {
            result = new BigDecimal(value.toString());
        } catch (Exception e) {
            logger.error("非法参数,无法转为Bigdecimal类型");
            result = new BigDecimal(defaultValue.toString());
        }
        return result;
    }


    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的加法运算,获取所有参数的和
     * @param: [values]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal add(Number... values) {
        BigDecimal result = BigDecimal.ZERO;
        if (values == null || values.length == 0) {
            return result;
        }
        for (Number value : values) {
            if (value != null) result = result.add(new BigDecimal(value.toString()));
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的加法运算,获取所有参数的和
     * @param: [values]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal add(BigDecimal... values) {
        BigDecimal result = BigDecimal.ZERO;

        if (values == null || values.length == 0) {
            return result;
        }
        for (BigDecimal value : values) {
            if (value != null) result = result.add(value);
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的减法运算。
     * @param: [value1, value2]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal sub(Number value1, Number... value2) {
        BigDecimal result = BigDecimal.ZERO;
        if(value1 != null) {
            result = result.add(new BigDecimal(value1.toString()));
        }
        if(value2 == null || value2.length == 0) {
            return result;
        };
        for(Number value : value2) {
            if(value != null) result = result.subtract(new BigDecimal(value.toString()));
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的减法运算。value1 - value2
     * @param: [value1, value2]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal sub(BigDecimal value1, BigDecimal... value2) {
        BigDecimal result = BigDecimal.ZERO;
        if (value1 != null) {
            result = result.add(value1);
        }
        if (value2 == null || value2.length == 0) {
            return result;
        }
        for (BigDecimal value : value2) {
            if (value != null) result = result.subtract(value);
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的乘法运算
     * @param: [values]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal mul(Number... values) {
        if (values == null || values.length == 0) {
            return null;
        }
        BigDecimal result = BigDecimal.ONE;
        for (Number value : values) {
            if (value != null) result = result.multiply(new BigDecimal(value.toString()));
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的乘法运算
     * @param: [values]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal mul(BigDecimal... values) {
        if (values == null || values.length == 0) {
            return null;
        }
        BigDecimal result = BigDecimal.ONE;
        for (BigDecimal value : values) {
            if (value != null) result = result.multiply(value);
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供(相对)精确的除法运算
     * @param: [dividend, divisor]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal div(Number dividend, Number divisor) {
        return div(dividend, divisor, DEFAULT_SCALE);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供(相对)精确的除法运算
     * @param: [dividend, divisor]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal div(BigDecimal dividend, BigDecimal divisor) {
        return div(dividend, divisor, DEFAULT_SCALE);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供(相对)精确的除法运算
     * @param: [dividend, divisor, scale]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal div(Number dividend, Number divisor, Integer scale) {
        if (dividend == null) return null;
        if (divisor == null || divisor.doubleValue() == 0) {
            throw new IllegalArgumentException(
                    "The divisor cannot be zero or null !");
        }
        if (scale == null) scale = DEFAULT_SCALE;
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(dividend.toString());
        BigDecimal b2 = new BigDecimal(divisor.toString());
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供(相对)精确的除法运算
     * @param: [dividend, divisor, scale]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal div(BigDecimal dividend, BigDecimal divisor, Integer scale) {
        if (dividend == null) return null;
        if (divisor == null || divisor.doubleValue() == 0) {
            throw new IllegalArgumentException(
                    "The divisor cannot be zero or null !");
        }
        if (scale == null) scale = DEFAULT_SCALE;
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        return dividend.divide(divisor, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的小数位四舍五入处理
     * @param: [value]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal round(Number value) {
        return round(value, DEFAULT_SCALE);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的小数位四舍五入处理
     * @param: [value]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal round(BigDecimal value) {
        return round(value, DEFAULT_SCALE);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的小数位四舍五入处理
     * @param: [value, scale]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal round(BigDecimal value, Integer scale) {
        if (value == null) return null;
        if (scale == null) scale = DEFAULT_SCALE;
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        return value.setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 提供精确的小数位四舍五入处理
     * @param: [value, scale]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal round(Number value, Integer scale) {
        if (value == null) return null;
        if (scale == null) scale = DEFAULT_SCALE;
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(value.toString());
        return b.divide(BigDecimal.ONE, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 格式化输出 (默认保留2位小数)
     * @param: [value]
     * @return: java.lang.String
     */
    public static String format(BigDecimal value) {
        if (value == null) {
            throw new IllegalArgumentException("The value must be a valid value.");
        }
        DecimalFormat df = new DecimalFormat(".00");
        return df.format(value);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 比较返回小的
     * @param: [a, b]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal min(Object a, Object b) {
        BigDecimal i = new BigDecimal(String.valueOf(a));
        BigDecimal j = new BigDecimal(String.valueOf(b));
        return i.compareTo(j) < 0 ? i : j;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 比较返回小的
     * @param: [a, b]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal min(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) < 0 ? a : b;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 比较返回大的
     * @param: [a, b]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal max(BigDecimal a, BigDecimal b) {
        return a.compareTo(b) > 0 ? a : b;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 返回百分比
     * @param: [a]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal toPercent(BigDecimal a) {
        return a.divide(new BigDecimal("100"));
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 对象为null时转换为零
     * @param: [a]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal transNullToZERO(BigDecimal a) {
        return a == null ? BigDecimal.ZERO : a;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 将null或空字符转换为零
     * @param: [a]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal transNullStringToZERO(String a) {
        if (StringUtils.isEmptyStr(a)) {
            return BigDecimal.ZERO;
        }
        return new BigDecimal(a.trim());
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 功能描述:负数转0
     * @param: [a]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal transMinusToZERO(BigDecimal a) {
        return a.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : a;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 由于java语言中对浮点数的二进制转换会产生问题,因此在将浮点数转换为BigDecimal类型时需要先将浮点数转换为String型
     * @param: [num]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal getExactBigDicimal(double num) {
        String numStr = num + "";
        return new BigDecimal(numStr);
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 校验是否为小于等于零的数字
     * @param: [number]
     * @return: boolean
     */
    public static boolean isNotPlus(BigDecimal number) {
        if (number == null) {
            return true;
        }
        if (number.compareTo(new BigDecimal(0)) <= 0) {
            return true;
        }
        return false;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 校验是否大于零的数字
     * @param: [number]
     * @return: boolean
     */
    public static boolean isGreaterZero(BigDecimal number) {
        if (number == null) {
            return false;
        }
        if (number.compareTo(new BigDecimal(0)) <= 0) {
            return false;
        }
        return true;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 将可能为空的BigDecimal转为BigDecimal
     * @param: [num]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal convertBigDecimal(BigDecimal num) {
        if (num == null) {
            num = new BigDecimal(0);
        }
        return num;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 将可能为空的Integer转为0
     * @param: [integer]
     * @return: java.lang.Integer
     */
    public static Integer convertInteger(Integer integer) {
        if (integer == null) {
            integer = new Integer(0);
        }
        return integer;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 将BigDecimal转为BigDecimal, 允许自己定义异常时的返回值
     * @param: [num, bd]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal convertBigDecimal(BigDecimal num, BigDecimal bd) {
        if (num == null) {
            return bd;
        }
        return num;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 将BigDecimal转为String
     * @param: [num]
     * @return: java.lang.String
     */
    public static String covertBigDecimalToString(BigDecimal num) {
        if (num == null) {
            return "";
        }
        return num.toString();
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 将BigDecimal转为double
     * @param: [num]
     * @return: double
     */
    public static double toDouble(BigDecimal num) {
        if (num == null) {
            return 0;
        }
        return num.doubleValue();
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 判断bd1是否小于bd2
     * @param: [bd1, bd2]
     * @return: boolean
     */
    public static boolean compareBigDecimalMinus(BigDecimal bd1, BigDecimal bd2) {
        boolean returnFlag = false;
        int i1 = bd1.compareTo(bd2);
        if (i1 < 0) {
            returnFlag = true;
        }
        return returnFlag;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 判断bd1是否小于等于bd2
     * @param: [bd1, bd2]
     * @return: boolean
     */
    public static boolean compareBigDecimalMinusEq(BigDecimal bd1, BigDecimal bd2) {
        boolean returnFlag = false;
        int i1 = bd1.compareTo(bd2);
        if (i1 < 0 || i1 == 0) {
            returnFlag = true;
        }
        return returnFlag;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 判断bd1是否大于bd2
     * @param: [bd1, bd2]
     * @return: boolean
     */
    public static boolean compareBigDecimalPlus(BigDecimal bd1, BigDecimal bd2) {
        boolean returnFlag = false;
        int i1 = bd1.compareTo(bd2);
        if (i1 > 0) {
            returnFlag = true;
        }
        return returnFlag;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 判断BigDecimal是否为null
     * @param: [bigDecimal]
     * @return: boolean
     */
    public static boolean isNullBigDecimal(BigDecimal bigDecimal) {
        boolean result = false;
        if (bigDecimal == null) {
            result = true;
        }
        return result;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 判断BigDecimal是否大于或等于零,为null时返回false
     * @param: [bigDecimal]
     * @return: boolean
     */
    public static boolean isGreaterOrEqualToZero(BigDecimal bigDecimal) {
        boolean result = false;
        if (BigDecimalUtils.isNullBigDecimal(bigDecimal)) {
            return result;
        }
        if (bigDecimal.compareTo(BigDecimal.ZERO) >= 0) {
            result = true;
        }
        return result;

    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 如果bigDecimal等于0则返回1,否则返回bigDecimal
     * @param: [bigDecimal]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal transZEROToONE(BigDecimal bigDecimal) {
        if (BigDecimal.ZERO.compareTo(bigDecimal) == 0) {
            return BigDecimal.ONE;
        } else {
            return bigDecimal;
        }
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 判断两个BigDecimal 是否相等
     * @param: [one, two]
     * @return: boolean
     */
    public static boolean isEqual(BigDecimal one, BigDecimal two) {
        return one.compareTo(two) == 0 ? true : false;
    }

    /**
     * @author: Paul
     * @time: 2021/10/28
     * @description: 对BigDecimal类型进行四舍五入并返回BigDecimal
     * @param: [one, size]
     * @return: java.math.BigDecimal
     */
    public static BigDecimal roundBigDecimal(BigDecimal one, int size) {
        return one.setScale(size, BigDecimal.ROUND_HALF_UP);
    }

}

上述需要用到字符串工具类的一些方法,我就自己搞了个字符串工具类StringUtils 。

/**
 * @Author: Paul
 * @Date: 2021/10/28
 * @Function: 字符串工具类
 */
public class StringUtils {

    /**
     *@author: Paul
     *@time: 2021/10/28
     *@description: 判断字符串是否为空或者为空白串
     *@param: [str]
     *@return: boolean
     */
    public static boolean isEmptyStr(String str) {
        if (null == str || "".equals(str.trim())) {
            return true;
        } else
            return false;
    }

    /**
     *@author: Paul
     *@time: 2021/10/28
     *@description: 判断字符串是否非空
     *@param: [str]
     *@return: boolean
     */
    public static boolean isNotEmpty(String str) {
        return !isEmptyStr(str);
    }
}

好了,今天的分享就到这吧。
See u !
关注我,升职加薪就是你!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 精确计算工具类。 /** * @Title: Arith.java * @Package com.uxun.pay.util * @Description: TODO(用一句话描述该文件做什么) * @author daiw * @date 2016-1-5 上午9:05:34 * @version V1.0 */ package com.xwtec.commonutil; import java.math.BigDecimal; /** * Arith * (由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入) * @author chenke * @time 2017/12/5 16:22 * @mail ch_chenke@163.com */ public class Arith { //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; //这个类不能实例化 private Arith() { } /** * 提供精确的String转换成double * @param v * @return */ public static double strPreDou(String v) { BigDecimal b = new BigDecimal(v); return b.doubleValue(); } /** * 提供精确的加法运算。 * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况,精确到 * 小数点以后10位,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double div(double v1, double v2) { return div(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况,由scale参数指 * 定精度,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐先生Paul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值