Як використовувати оператори порівняння на зразок>, =, <у BigDecimal


103

У мене є доменний клас, встановлений unitPrice як тип даних BigDecimal. Зараз я намагаюся створити метод порівняння ціни, але, схоже, я не можу мати операторів порівняння у типі даних BigDecimal. Чи потрібно змінювати тип даних або є інше?


так BigDecimalяк це Object, ні, це не працює. Але ви можете просто відняти один від одного і перевірити, чи є отримане значення <0, ==0або >0. В іншому випадку ви можете піти стандартним шляхом з наданими методами від BigDecimal
SomeJavaGuy

2
Ось чому існує compareToметод, який повертає -1, 0 або 1. Який в основному є Comparable.
М. Дейнум

Відповіді:


113

Кожен об’єкт Класу BigDecimalмає метод, compareToякий можна використовувати для порівняння його з іншим BigDecimal. Результат compareToпорівнюється > 0, == 0або в < 0залежності від того, що вам потрібно. Прочитайте документацію, і ви дізнаєтесь.

Оператори ==, <, >і так далі можуть бути використані тільки на примітивних типів даних , таких як int, long, doubleабо їх класів обгортки , як Integerі Double.

З документації compareTo:

Порівняє це BigDecimalіз зазначеним BigDecimal.

BigDecimal За цим методом два об'єкти, які мають однакову величину, але мають різну шкалу (наприклад, 2,0 та 2,00), вважаються рівними. Цей спосіб надається в перевазі індивідуальним методам для кожного з шести булевих операторів порівняння (<, ==,>,> =,! =, <=). Пропонована ідіома для проведення цих порівнянь:, (x.compareTo(y) <op> 0)де <op> один із шести операторів порівняння.

Повертає: -1, 0 або 1, оскільки цей BigDecimal чисельно менший, рівний або більший за val.


1
Але чи допомагає метод CompareTo з'ясувати, чи є ціна більша, дорівнює або нижча?
користувач3127109

2
Так. Ця інформація знаходиться за посиланням, поданим у відповіді.
Дрю Кеннеді

4
@ user3127109 так, a.compareTo(b)повертає число, що перевищує нуль, якщо a > b, 0якщо a == b, і менше нуля, якщо a < b.
Золтан

119

Коротше кажучи:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    

22

Використовуйте compareToметод BigDecimal:

public int CompareTo (BigDecimal val) Порівняє цей BigDecimal із заданим BigDecimal.

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

12

Ви можете використовувати метод з ім'ям compareTo, x.compareTo(y). Він поверне 0, якщо x і y рівні, 1 якщо x більше y та -1, якщо x менше y


11

Ось приклад для всіх шести операторів булевого порівняння (<, ==,>,> =,! =, <=):

BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);

System.out.println(big10.compareTo(big20) < -1);  // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1);  // false
System.out.println(big10.compareTo(big20) != -1); // false

System.out.println(big10.compareTo(big20) < 0);   // true
System.out.println(big10.compareTo(big20) <= 0);  // true
System.out.println(big10.compareTo(big20) == 0);  // false
System.out.println(big10.compareTo(big20) >= 0);  // false
System.out.println(big10.compareTo(big20) > 0);   // false
System.out.println(big10.compareTo(big20) != 0);  // true

System.out.println(big10.compareTo(big20) < 1);   // true
System.out.println(big10.compareTo(big20) <= 1);  // true
System.out.println(big10.compareTo(big20) == 1);  // false
System.out.println(big10.compareTo(big20) >= 1);  // false
System.out.println(big10.compareTo(big20) > 1);   // false
System.out.println(big10.compareTo(big20) != 1);  // true

5

BigDecimalне є примітивним, так що ви не можете використовувати <, >оператор. Однак, оскільки це a Comparable, ви можете використовувати compareTo(BigDecimal)той же ефект. Наприклад:

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}

0

Використовуючи com.ibm.etools.marshall.util.BigDecimalRange util-клас IBM, можна порівняти, якщо BigDecimal в діапазоні.

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);

0

Цей потік містить безліч відповідей, вказуючи, що метод BigDecimal.compareTo (BigDecimal) використовується для порівняння екземплярів BigDecimal . Я просто хотів додати ще не досвідченого використання методу BigDecimal.compareTo (BigDecimal), щоб бути обережним з тим, як ви створюєте свої екземпляри BigDecimal . Так, наприклад ...

  • new BigDecimal(0.8)створить BigDecimalекземпляр зі значенням, яке не точно 0.8і яке має масштаб 50+,
  • new BigDecimal("0.8")створить BigDecimalекземпляр зі значенням , яке є точно 0.8і який має шкалу від 1

... і за методом BigDecimal.compareTo (BigDecimal) вони вважатимуться неоднаковими, оскільки їх значення неоднакові, коли шкала не обмежується кількома десятковими знаками.

Перш за все, будьте обережні, щоб створити ваші BigDecimalекземпляри за допомогою BigDecimal(String val)конструктора чи BigDecimal.valueOf(double val)методу, а не BigDecimal(double val)конструктора. По-друге, зауважте, що ви можете обмежити масштаб екземплярів BigDecimal перед порівнянням їх методом BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.