Bigdecimal 的 compareTo 和 equals 方法

全栈程序员
优质创作者: 后端开发技术领域
2023-07-05 15:37:10

需要注意的是,在比较 BigDecimal 对象时,推荐使用 compareTo 方法而不是 equals 方法,因为由于精度和小数位数的差异, equals 方法可能无法给出准确的结果。

  • BigDecimal 类的 compareTo 方法和 equals 方法都可以用来判断两个 BigDecimal 对象是否相等。 compareTo 方法用于比较两个 BigDecimal 对象的大小关系。它返回一个整数值,表示两个数字之间的关系。如果第一个数字小于第二个数字,它返回一个负数;如果第一个数字大于第二个数字,它返回一个正数;如果两个数字相等,它返回 0。 以下是使用 compareTo 方法的示例代码:
BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal("5.5");
int result = num1.compareTo(num2);
if (result < 0) {
    System.out.println("num1 小于 num2");
} else if (result > 0) {
    System.out.println("num1 大于 num2");
} else {
    System.out.println("num1 等于 num2");
}
  • equals 方法用于检查两个 BigDecimal 对象是否相等。它返回一个布尔值,如果两个数字相等则返回 true ,否则返回 false 。 以下是使用 equals 方法的示例代码:
BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal("10.5");
if (num1.equals(num2)) {
    System.out.println("num1 等于 num2");
} else {
    System.out.println("num1 不等于 num2");
}
...全文
434 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
【源码免费下载链接】:https://renmaiwang.cn/s/4pu75 在Java编程语言中,BigDecimal类用于表示任意精度的十进制浮点数,它提供了对大数值计算的精确控制。本文将深入探讨BigDecimal的`equals`方法和`compareTo`方法的区别,这对于处理财务、金融等领域中对精度要求极高的计算至关重要。`equals`方法是Java对象的基本方法,它用于判断当前对象是否与指定对象相等。在BigDecimal的实现中,`equals`方法不仅比较数值的值,还会考虑它们的精确度(scale)。如果两个BigDecimal对象的值和精确度都相同,`equals`方法才会返回true。例如:```javaBigDecimal bd1 = new BigDecimal("1.2");BigDecimal bd2 = new BigDecimal("1.20");System.out.println(bd1.equals(bd2)); // 输出false```在这个例子中,虽然bd1和bd2代表的数值相等,但由于它们的精确度不同(bd1的精确度是1,bd2的精确度是2),`equals`方法返回false。相比之下,`compareTo`方法则主要关注数值的大小关系,而不是精确度。当调用`compareTo`时,它会先比较两个BigDecimal的符号,然后根据它们的整数部分(intVal)进行比较。如果符号相同,它会通过`matchScale`方法调整两个BigDecimal的精确度,使得它们具有相同的规模,然后再进行比较。这样可以确保即使精确度不同,也能正确判断数值的大小。例如:```javaSystem.out.println(bd1.compareTo(bd2) == 0); // 输出true```这里,`compareTo`方法返回0,
java 代码 BigDecimal b1=new BigDecimal("1.0"); BigDecimal b2=new BigDecimal("1.00"); boolean t=b1.equals(b2); 怎么样,你认为t是true还是false?它还真是false。BigDecimal的大小比较,1.0与1.00是不相等的,得采用它自带的compareTo方法: java 代码 int i=b1.compareTo(b2) 这一次,返回的i可能为-1、0、1,分别表示小于、等于、大于 构造函数:解决了上面这个问题好像万事大吉了,结果,我在做测试的时候,又发现了一个莫名其妙的问题,代码如下: BigDecimal bd=supplierRecentProductDao.findHistoryReturnRate("001", "001"); assertEquals(bd.compareTo(new BigDecimal(0.15)),0); 计算得到的bd值就是0.15,但是测试它偏偏告诉我: java 代码 junit.framework.AssertionFailedError: System.out.println("HistoryReturnRate:"+bd+","+new BigDecimal(0.15)); 发现结果是这样的: java 代码 HistoryReturnRate:0.150000,0.1499999999999999944488848768742172978818416595458984375 我们的 new BigDecimal(0.15)得到了一个超接近的数“0.1499999999999999944488848768742172978818416595458984375”,但它就是小于0.15。上网查得,BigDecimal有三种构造方式: java 代码 BigDecimal(Stirng s), BigDecimal(int i,int k), BigDecimal(double d) ,由于浮点运算的原因,要慎用第三种方式,否则就会得到上面的结果。所以,改用 java 代码 assertEquals(bd.compareTo(new BigDecimal("0.15")),0); 之后,测试顺利通过了。

17

社区成员

发帖
与我相关
我的任务
社区描述
全栈工程师社区
前端后端java 技术论坛(原bbs) 北京·大兴区
社区管理员
  • 全栈程序员
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧