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

105

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

user3127109
источник
так 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) .

Адиль Хуссейн
источник