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()(血淋淋的教训😓)。

相关推荐
清心歌几秒前
HashMap实现原理及扩容机制
java
一只大袋鼠几秒前
数据库连接池从入门到精通(下):Druid 连接池使用与工具类封装
java·数据库·连接池
禹中一只鱼4 分钟前
【IDEA 出现 `IDE error occurred`】
java·ide·spring boot·intellij-idea
西凉的悲伤4 分钟前
Guava类库——Lists.partition() 高效分批处理列表数据
java·guava
weixin_408099674 分钟前
【保姆级教程】按键精灵调用 OCR 文字识别 API(从0到1完整实战 + 可运行脚本)
java·前端·人工智能·后端·ocr·api·按键精灵
brahmsjiang6 分钟前
Java类加载机制解析:从JVM启动到双亲委派,再到Android的特殊实现
android·java·jvm
yaaakaaang8 分钟前
十一、享元模式
java·享元模式
卓怡学长9 分钟前
基于 SpringBoot 的生活信息分享平台,从 0 到 1 完整实现(附源码 + 数据库)
java·数据库·spring boot·tomcat·maven
ID_1800790547311 分钟前
Python解析小红书(XHS)笔记评论 API,json数据返回参考
java·服务器·数据库
努力努力再努力wz12 分钟前
【C++高阶系列】告别内查找局限:基于磁盘 I/O 视角的 B 树深度剖析与 C++ 泛型实现!(附B树实现源码)
java·linux·开发语言·数据结构·c++·b树·算法