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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BigInteger和BigDecimalJava中的两个类,用于处理大数和精确的小数计算。 BigInteger是一个用于表示大整数的类。它可以处理任意大小的整数,并提供了基本的加减乘除等操作方法。可以使用BigInteger类的构造方法实例化一个BigInteger对象,并使用add、subtract、multiply和divide等方法执行相应的加减乘除操作。 BigDecimal是一个用于表示高精度小数的类。它可以处理任意精度的小数,并提供了准确的四舍五入计算。BigDecimal类的基本操作与BigInteger类相似,可以进行加减乘除等运算。与BigInteger不同的是,BigDecimal还提供了setScale方法用于设置小数的精度。 可以使用BigDecimal类的构造方法实例化一个BigDecimal对象,并使用add、subtract、multiply、divide和setScale等方法执行相应的操作。 因此,BigInteger适用于处理大整数运算,而BigDecimal适用于处理高精度小数运算。都提供了丰富的方法来进行相应的运算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [BigInteger和BigDecimal知识点](https://blog.csdn.net/Guqiancheng/article/details/82263455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java核心技术知识点笔记—大数值BigInteger和BigDecimal](https://blog.csdn.net/lyklykkk/article/details/79190150)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值