Como usar operadores de comparação como>, =, <em BigDecimal

103

Eu tenho uma classe de domínio com unitPrice definido como tipo de dados BigDecimal. Agora estou tentando criar um método para comparar preços, mas parece que não posso ter operadores de comparação no tipo de dados BigDecimal. Tenho que alterar o tipo de dados ou existe outra maneira?

user3127109
fonte
uma vez que BigDecimalé um Object, não, isso não funciona. Mas você pode simplesmente subtrair um do outro e verificar se o valor resultante é <0, ==0ou >0. Caso contrário, você pode seguir o caminho padrão com os métodos fornecidos em BigDecimal
SomeJavaGuy
2
É por isso que existe um compareTométodo que retorna -1, 0 ou 1. Que é basicamente o Comparable.
M. Deinum

Respostas:

113

Cada objeto da classe BigDecimalpossui um método que compareTovocê pode usar para compará-lo a outro BigDecimal. O resultado de compareToé então comparado > 0, == 0ou < 0dependendo do que você precisa. Leia a documentação e você descobrirá.

Os operadores ==, <, >e assim por diante só pode ser usado em tipos de dados primitivos, como int, long, doubleou suas classes de mensagens publicitárias como Integere Double.

Da documentação de compareTo:

Compara isso BigDecimalcom o especificado BigDecimal.

Dois BigDecimal objetos de valor igual, mas com escala diferente (como 2,0 e 2,00) são considerados iguais por este método. Este método é fornecido em preferência aos métodos individuais para cada um dos seis operadores booleanos de comparação (<, ==,>,> =,! =, <=). O idioma sugerido para realizar essas comparações é:, (x.compareTo(y) <op> 0)onde <op> é um dos seis operadores de comparação.

Retorna: -1, 0 ou 1, pois este BigDecimal é numericamente menor, igual ou maior que val.

Simulante
fonte
1
Mas o método compareTo ajuda a descobrir se o preço é maior, igual ou menor que?
user3127109
2
Sim. Essas informações estão no link fornecido na resposta.
Drew Kennedy
4
@ user3127109 sim, a.compareTo(b)retorna um número maior que zero se a > b, 0se a == b, e menor que zero se a < b.
Zoltán
119

Para ser breve:

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

Use o compareTométodo de BigDecimal:

public int compareTo (BigDecimal val) Compara este BigDecimal com o BigDecimal especificado.

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

Você pode usar o método chamado compareTo, x.compareTo(y). Ele retornará 0 se x e y forem iguais, 1 se x for maior que y e -1 se x for menor que y

Agung Setiawan
fonte
11

Aqui está um exemplo para todos os seis operadores de comparação booleanos (<, ==,>,> =,! =, <=):

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
ognjenkl
fonte
5

BigDecimalnão é um primitivo, para que você não pode usar os <, >operadores. No entanto, como é um Comparable, você pode usar o compareTo(BigDecimal)para o mesmo efeito. Por exemplo:

public class Domain {
    private BigDecimal unitPrice;

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

    // etc...
}
Mureinik
fonte
0

Usando a classe util com.ibm.etools.marshall.util.BigDecimalRange da IBM, pode-se comparar se BigDecimal no intervalo.

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

Este tópico tem muitas respostas afirmando que o método BigDecimal.compareTo (BigDecimal) é aquele a ser usado para comparar as instâncias de BigDecimal . Eu só queria adicionar algo que não tenha experiência no uso do método BigDecimal.compareTo (BigDecimal) para ter cuidado com a forma como você está criando suas instâncias BigDecimal . Então, por exemplo ...

  • new BigDecimal(0.8)irá criar uma BigDecimalinstância com um valor que não é exatamente 0.8e que tem uma escala de 50+,
  • new BigDecimal("0.8")irá criar uma BigDecimalinstância com um valor que é exato 0.8e que tem uma escala de 1

... e os dois serão considerados desiguais de acordo com BigDecimal.compareTo (BigDecimal) método porque seus valores são desiguais quando a escala não está limitada a algumas casas decimais.

Em primeiro lugar, tenha o cuidado de criar suas BigDecimalinstâncias com o BigDecimal(String val)construtor ou o BigDecimal.valueOf(double val)método em vez do BigDecimal(double val)construtor. Em segundo lugar, observe que você pode limitar a escala de instâncias BigDecimal antes de compará-las por meio do método BigDecimal.setScale (int newScale, RoundingMode roundingMode) .

Adil Hussain
fonte