在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的值不相等