BigDecimal踩坑

1. 常用四大方法

  • 加 add
  • 减 subtract
  • 乘 multiply
  • 除 divide

2. 比较使用 compareTo

  • 不能使用 == (都知道)
  • equals 写惯了,冷不丁一写就忘,内部重写了 会比较两个数的精度长度是否相等 (2与 2.00 不等)
  • A.compareTo(B)
    • == 0 相等
    • 0 理解为 A- B > 0 A > B

    • < 0 理解为 A- B < 0 A < B

3. 除法精度问题

  • 使用 A.divide(B) 时强烈建议,跟随保留小数问题
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");

BigDecimal result = a.divide(b); // ❌
  • 异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
  • 尽可能使用:
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP);

4. BigDecimal 初始化建议

  • BigDecimal初始化使用 String 类型 或者 BigDecimal.valueOf(),避免精度误差
BigDecimal a = new BigDecimal(0.1);
System.out.println(a); // 输出:0.1000000000000000055511151231257827021181583404541015625

5. BigDecimal 是不可变对象

  • 参数传递时行为看起来像是值传递,一旦创建就不能更改原值,所有运算返回新对象
public void change(BigDecimal num) {
    num = num.add(new BigDecimal("1"));
}

public void test() {
    BigDecimal a = new BigDecimal("10");
    change(a);
    System.out.println(a); // 输出还是 10,没有改变
}

6. 保留小数问题

BigDecimal amount = new BigDecimal("123.456");
amount = amount.setScale(2, RoundingMode.HALF_UP); // 保留两位小数
  • 注意:在转换为 json 时末尾是 .00 会丢失 只保留末尾非 0 部分,建议转换为 String

转 json 方法:

  1. @JsonSerialize(using = ToStringSerializer.class)
    private BigDecimal amount;
    
  2. public String getAmountStr() {
        return amount.setScale(2, RoundingMode.HALF_UP).toPlainString();
    }
    
BigDecimal不等于null。在给定的引用内容中,可以通过判断BigDecimal对象是否为null来确定其是否为空。在Java中,可以使用以下代码来判断BigDecimal对象是否为null: ```java BigDecimal bigDecimal = null; if (bigDecimal != null) { // BigDecimal对象不为null的逻辑处理 // ... } else { // BigDecimal对象为null的逻辑处理 // ... } ``` 注意,如果BigDecimal对象被赋予了一个具体的值,那么它就不会是null。只有当BigDecimal对象没有被赋值时,它才会是null。因此,只有在BigDecimal对象为null时,才能判断BigDecimal等于null。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JAVA 判断一个字符串不是空字符串,不等于Null,不等于0包括(0.00,0.000);](https://blog.csdn.net/m0_59680416/article/details/122469196)[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%"] - *2* *3* [关于BigDecimal判断是否为0的逻辑](https://blog.csdn.net/gli_001/article/details/126172064)[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
发出的红包

打赏作者

孔.Chandler

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

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

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

打赏作者

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

抵扣说明:

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

余额充值