用BigDecimal的做等值比较要注意

31 阅读1分钟

在Java中,BigDecimal 类的 equals() 方法确实会比较值的大小和精度(也就是小数点后的位数,即scale)。因此,即使两个 BigDecimal 对象代表的数值在数学上是相等的,如果它们的scale不同,equals() 方法仍然会返回 false

compareTo() 方法则不同,它会忽略scale的差异,只比较数值的大小。如果两个 BigDecimal 对象在数值上相等,不管它们的scale是否相同,compareTo() 方法都会返回 0

在处理金融数据或需要精确小数比较的场合时,推荐使用 compareTo() 方法来判断数值是否相等。这是因为在金融计算中,通常关心的是数值是否相等,而不是它们是否在表示上完全相同(包括精度)。

在您给出的示例代码中,compareTo() 会认为 num1num2 的数值是相等的,而 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的值不相等