Null Safe 比较两个具有 0.0 和 0 的 bigdecimal 对象

Null Safe Compare two bigdecimal objects having 0.0 and 0

最初的代码是:

            if(!Objects.equals(src.getApplicationItemCost(), dest.getApplicationItemCost())){
               log.info("Difference")
            }

输出:

      getApplicationItemCost: src:0.0| dest:0
      Difference

ApplicationItemCost 是 BigDecimal 类型。

如果我使用 compareTo,那么我必须明确检查空值,例如:

LOG.info("getApplicationItemCost: src:" + src.getApplicationItemCost() + "| dest:" + dest.getApplicationItemCost());
        if((src.getApplicationItemCost()==null && dest.getApplicationItemCost()!=null)
                || (src.getApplicationItemCost()!=null && dest.getApplicationItemCost()==null)
                || !Objects.equals(src.getApplicationItemCost(), dest.getApplicationItemCost())
                || src.getApplicationItemCost().compareTo(dest.getApplicationItemCost())!=0 )

任何比较 0.0 和 0 的建议。为什么会有这种差异? (可能是数据库有 Number 字段,当转换为大十进制时它不显示 0.0?)

尝试使用

CompareToBuilder

class 由

提供

org.apache.commons.lang3

因为它可以进行 null 安全比较。示例代码为:

public static <T, U> int nullSafeComparison(T t, U u) {
        return new CompareToBuilder().append(t, u).toComparison();
    }

public static void main(String[] args) {
        BigDecimal zero = BigDecimal.ZERO;
        BigDecimal zeroPzero = new BigDecimal("0.0");

        System.out.println( zero + " " + zeroPzero);

        System.out.println(nullSafeComparison(zero, zeroPzero));
    }

如果两个数字相同,它将 return 0,如果第一个大于第二个,结果将为 1,如果第一个小于第二个,则结果为 -1。

Custom BigDecimal null safe Comparison (without any exteranal library):

{
    BigDecimal big1, big2; 

    big1 = new BigDecimal(0); 
    big2 = new BigDecimal(0.0); 

    int compareResult1 = compareTo(b1,null);
    int compareResult2 = compareTo(null,b2);
}

public static <T extends Comparable<T>> int compareTo(final T c1, final T c2) {
    final boolean f1, f2;
    return (f1 = c1 == null) ^ (f2 = c2 == null) ? f1 ? -1 : 1 : f1 && f2 ? 0 : c1.compareTo(c2);
}

建立一个比较器:

Comparator<BigDecimal> c = Comparator.nullsFirst(Comparator.naturalOrder());

(或 nullsLast,如果您只与零进行比较并不重要)。

然后:

if (c.compare(first, second) != 0) {
  // ...
}