Безопасный ноль Сравните два больших десятичных объекта, имеющих 0.0 и 0 - PullRequest
1 голос
/ 12 февраля 2020

Первоначально код был:

            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?)

Ответы [ 3 ]

6 голосов
/ 12 февраля 2020

Постройте компаратор:

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

(или nullsLast, не имеет значения, сравниваете ли вы его только с нулем).

Тогда:

if (c.compare(first, second) != 0) {
  // ...
}
1 голос
/ 12 февраля 2020

Пользовательское сравнение BigDecimal с нулевым безопасным значением (без какой-либо внешней библиотеки):

{
    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);
}
0 голосов
/ 12 февраля 2020

Попробуйте использовать

CompareToBuilder

класс предоставляется

org. apache .commons.lang3

, поскольку это делает нулевое безопасное сравнение. Пример кода:

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));
    }

Если оба числа одинаковы, он вернет 0, если 1 больше 2, то результат будет 1 и -1, если 1 число меньше 2.

...