在Java中,BigDecimal
类的 equals()
方法确实会比较值的大小和精度(也就是小数点后的位数,即scale)。因此,即使两个 BigDecimal
对象代表的数值在数学上是相等的,如果它们的scale不同,equals()
方法仍然会返回 false
。
而 compareTo()
方法则不同,它会忽略scale的差异,只比较数值的大小。如果两个 BigDecimal
对象在数值上相等,不管它们的scale是否相同,compareTo()
方法都会返回 0
。
在处理金融数据或需要精确小数比较的场合时,推荐使用 compareTo()
方法来判断数值是否相等。这是因为在金融计算中,通常关心的是数值是否相等,而不是它们是否在表示上完全相同(包括精度)。
在您给出的示例代码中,compareTo()
会认为 num1
和 num2
的数值是相等的,而 equals()
则会因为scale的不同而判断它们不相等。这一点在编写处理金额的代码时必须要注意,以避免逻辑错误。
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("120.51");
BigDecimal num2 = new BigDecimal("120.510");
int compareTo = num1.compareTo(num2);
if (compareTo == 0) {
System.out.println("num1和num2的值相等");
} else if (compareTo > 0) {
System.out.println("num1大于num2");
} else {
System.out.println("num1小于num2");
}
boolean equals = num1.equals(num2);
if (equals) {
System.out.println("num1和num2的值相等");
} else {
System.out.println("num1和num2的值不相等");
}
}
输出结果
num1和num2的值相等
num1和num2的值不相等