BigDecimal 常用知识点总结

BigDecimal a = new BigDecimal(100);
BigDecimal b = newBigDecimal(2);

一.加减乘除取余运算:四舍五入保留两位小数

1.加法

BigDecimal add = a.add(b).setScale(2, BigDecimal.ROUND_HALF_UP);

2.减法

BigDecimal subtract = a.subtract(b).setScale(2, BigDecimal.ROUND_HALF_UP);

3.乘法

BigDecimal multiply = a.multiply(b).setScale(3, BigDecimal.ROUND_HALF_UP);

4.除法

BigDecimal divide = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);

如果直接使用a.divide(b)除法,有时会报除不尽异常,如下:
BigDecimal a = new BigDecimal(10);
BigDecimal b = new BigDecimal(3);
a = a.divide(b);
错误会报如下异常:java.lang.ArithmeticException: Non-terminating decimal
expansion; no exact representable decimal result.

5.取余

BigDecimal[] bigDecimals = a.divideAndRemainder(b);

返回一个BigDecimal数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数。

注:加减乘除取余a,b都不能为空,否则会产生 Exception in thread "main" java.lang.NullPointerException

二.BigDecimal 处理小数

四舍五入保留两位小数
setScale(2, BigDecimal.ROUND_HALF_UP)

setScale()
setScale(1) 表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入(5则向上入),2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入(5则向下舍),2.35变成2.3

三.比较运算

BigDecimal可以通过compareTo方法来进行比较。
返回的结果是int类型,-1表示小于,0是等于,1是大于。

if(a.compareTo(b) == -1){
	System.out.println("a小于b");
}

if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
 
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
 
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
 
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

四.BigDecimal常用方法

/**
 * 将对象转化为 BigDecimal
 *
 * @param value 对象值
 * @return 对应的 BigDecimal 对象,如果无法转换则返回 null
 * @throws ClassCastException 如果无法将 value 转换为 BigDecimal
 */
public static BigDecimal getBigDecimal(Object value) {
    if (value == null) {
        return null;
    } else if (value instanceof BigDecimal) {
        return (BigDecimal) value;
    } else if (value instanceof String) {
        return new BigDecimal((String) value);
    } else if (value instanceof BigInteger) {
        return new BigDecimal((BigInteger) value);
    } else if (value instanceof Number) {
        return BigDecimal.valueOf(((Number) value).doubleValue());
    } else {
        throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass() + " into a BigDecimal.");
    }
}


/**
 * 两个bigdecimal相加保留两位小数
 *
 * @param big1
 * @param big2
 * @return
 */
public static BigDecimal add(BigDecimal big1, BigDecimal big2) {
    big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
    big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);

    return big1.add(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}

/**
 * 两个bigdecimal 相减保留两位小数
 *
 * @param big1
 * @param big2
 * @return
 */
public static BigDecimal sub(BigDecimal big1, BigDecimal big2) {
    big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
    big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);

    return big1.subtract(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}


/**
 * 两个bigdecimal 相乘保留两位小数
 *
 * @param big1
 * @param big2
 * @return
 */
public static BigDecimal mul(BigDecimal big1, BigDecimal big2) {
    big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
    big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);

    return big1.multiply(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}


/**
 * 两个bigdecimal 相除保留两位小数
 *
 * @param big1
 * @param big2
 * @return
 */
public static BigDecimal div(BigDecimal big1, BigDecimal big2) {
    big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
    big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);

    return big1.divide(big2).setScale(2, BigDecimal.ROUND_HALF_UP);
}


/**
 * 比较两个bigdecimal 是否相等
 *
 * @param big1
 * @param big2
 * @return
 */
public static boolean equals(BigDecimal big1, BigDecimal big2) {
    big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
    big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);

    return 0 == big1.compareTo(big2);
}

/**
 * 两个bigdecimal相互比较
 * 
 * 返回的结果是int类型,-1表示小于,0是等于,1是大于。
 */
public static int compare(BigDecimal big1, BigDecimal big2) {
    big1 = Optional.ofNullable(big1).orElse(BigDecimal.ZERO);
    big2 = Optional.ofNullable(big2).orElse(BigDecimal.ZERO);

    return big1.compareTo(big2);
}


/**
 * 字符串转换 为 BigDecimal ,保留小数位数 2 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal2(String str) {
    if (StrUtil.isBlank(str)) {
        return BigDecimal.ZERO;
    }
    return NumberUtils.toScaledBigDecimal(str, 2, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数 4 位
 *
 * @param str
 * @return
 */
public static BigDecimal toBigDecimal4(String str) {
    if (StrUtil.isBlank(str)) {
        return BigDecimal.ZERO;
    }
    return NumberUtils.toScaledBigDecimal(str, 4, RoundingMode.HALF_UP);
}

/**
 * 字符串转换 为 BigDecimal ,保留小数位数
 *
 * @param str   字符串
 * @param scale 保留小数位数
 * @return
 */
public static BigDecimal toBigDecimal(String str, int scale) {
    if (StrUtil.isBlank(str)) {
        return BigDecimal.ZERO;
    }
    return NumberUtils.toScaledBigDecimal(str, scale, RoundingMode.HALF_UP);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

java攻城狮1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值