为什么 BigDecimal(“5.50”) 不等于 BigDecimal(“5.5”)以及如何解决此问题?

2022-08-31 16:05:20

实际上,我已经找到了可能的解决方案

//returns true
new BigDecimal("5.50").doubleValue() == new BigDecimal("5.5").doubleValue()

当然,可以通过使比较更加健壮来改进它,但问题是这种技术是否可以接受,或者是否有更好的解决方案?Math.abs (v1 - v2) < EPS

如果有人知道为什么java设计人员决定以这种方式实现BigDecimal的等式,那么阅读起来会很有趣。


答案 1

来自 BigDecimal 的 javadoc

等于

public boolean equals(Object x)

将其与为相等指定的值进行比较。与 compareTo 不同,此方法仅在两个对象的值和比例相等时才认为它们相等(因此,当使用此方法进行比较时,2.0 不等于 2.00)。BigDecimalObjectBigDecimal

简单使用compareTo() == 0


答案 2

比较忽略尾随零的最简单表达式是 Java 1.5:

bd1.stripTrailingZeros().equals(bd2.stripTrailingZeros())

推荐