Как использовать операторы сравнения, такие как>, =, <на BigDecimal


105

У меня есть класс домена с unitPrice, установленным как тип данных BigDecimal. Сейчас я пытаюсь создать метод сравнения цен, но, похоже, у меня нет операторов сравнения в типе данных BigDecimal. Мне нужно изменить тип данных или есть другой способ?


так BigDecimalкак есть Object, нет, это не работает. Но вы можете просто вычесть их друг из друга и проверить, будет ли полученное значение <0, ==0или >0. В противном случае вы могли бы пойти стандартным путем с предоставленными методами из BigDecimal
SomeJavaGuy

2
Вот почему существует compareToметод, который возвращает -1, 0 или 1. В основном это Comparable.
M. Deinum 08

Ответы:


115

У каждого объекта класса 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 определить, например, является ли цена больше, равна или ниже?
user3127109 08

2
Да. Эта информация находится по ссылке в ответе.
Дрю Кеннеди

4
@ user3127109 yes, a.compareTo(b)возвращает число больше нуля, если a > b, 0если a == b, и меньше нуля, если a < b.
Zoltán

121

Короче:

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 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.