BigDecimal对象比较时的注意事项

BigDecimal对象比较时的注意事项

!NOTE

在涉及到价钱和需要保证高精度的项目中我们往往使用BigDecimal对象来存储值,而在对象在进行比较时有一些地方需要注意(博主也是替大家踩了坑了🥲)

我们先来看下面这几行代码,思考他们的输出:

java 复制代码
@Test
    public void test() {
        System.out.println(new BigDecimal(1).equals(new BigDecimal(1.00000)));
        System.out.println(new BigDecimal(1).equals(new BigDecimal("1.00000000")));
       System.out.println(new BigDecimal(1).compareTo(new BigDecimal("1.00000000000000000000")));
    }

结果可能非你所料:

bash 复制代码
true
false
0

为什么会这样呢?我们来依个分析:

java 复制代码
new BigDecimal(1).equals(new BigDecimal(1.00000))  //true

对于上面的代码

  • new BigDecimal(1) - 从int创建,值为1,精度(scale)=0

  • new BigDecimal(1.00000) - 从double创建,double值1.00000在二进制浮点数中就是1.0

  • 问题所在:从double创建:可能丢失精度信息,结果不可预测

java 复制代码
System.out.println(new BigDecimal(1).equals(new BigDecimal("1.00000000"))); //false
  • new BigDecimal(1) - 从int创建,值为1,精度(scale)=0

  • new BigDecimal("1.00000000") - 从字符串创建,值为1,精度(scale)=8

  • 问题所在:equals严格比较精度和数值,如果你需要考虑精度的话,可以考虑

java 复制代码
  System.out.println(new BigDecimal(1).compareTo(new BigDecimal("1.00000000000000000000"))); // 0
  • new BigDecimal(1) - 值为1,精度=0
  • new BigDecimal("1.00000000000000000000") - 值为1,精度=20
  • compareTo只比较数值大小,不比较精度

总结

  • 从double创建:可能丢失精度信息,结果不可预测
  • 从字符串创建:完全保留精度信息
  • equals():严格比较值和精度
  • compareTo():只比较数值大小,推荐用于数值比较

所以在实际开发中,对于BigDecimal的数值比较应该使用compareTo() == 0而不是equals()(血淋淋的教训😓)。

相关推荐
namexingyun15 小时前
拆解Fable 5三重安全护栏:模型路由、蒸馏防护与生物安全分类器的技术原理 - 微元算力(weytoken)
java·人工智能·python·安全·架构·ai编程
地铁潜行者15 小时前
加了幂等表,为什么消息重试反而不执行了?聊聊 MQ 消费幂等的边界
java·后端
摇滚侠15 小时前
SpringMVC 入门到实战 视图解析器 44-48
java·spring·maven·intellij-idea
記億揺晃着的那天15 小时前
告别误操作!Spring Boot 多环境配置隔离与启动守卫实战
java·spring boot·后端·环境隔离
我是唐青枫16 小时前
Java Spring Data JPA 实战指南:Repository 查询、分页与实体映射
java·开发语言
染翰16 小时前
Nacos 切换 Namespace 后配置不生效、占位符报错终极复盘
java·后端·spring·nacos
terry60016 小时前
2026图形验证码服务商横向测评|口碑、接入、安全选型全指南
java·大数据·人工智能·web安全·信息与通信·数据库架构
阿坤带你走近大数据16 小时前
java中泛型不能用基础数据类型
java·开发语言
skywalker_1116 小时前
SpringBoot速通(实战教学)
java·spring boot·redis·rpc·ssm·mybatis-plus
云絮.17 小时前
增删改查操作
java·开发语言