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?
java
operator-keyword
bigdecimal
user3127109
fonte
fonte
BigDecimal
é umObject
, não, isso não funciona. Mas você pode simplesmente subtrair um do outro e verificar se o valor resultante é<0
,==0
ou>0
. Caso contrário, você pode seguir o caminho padrão com os métodos fornecidos em BigDecimalcompareTo
método que retorna -1, 0 ou 1. Que é basicamente oComparable
.Respostas:
Cada objeto da classe
BigDecimal
possui um método quecompareTo
você pode usar para compará-lo a outro BigDecimal. O resultado decompareTo
é então comparado> 0
,== 0
ou< 0
dependendo 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, comoint
,long
,double
ou suas classes de mensagens publicitárias comoInteger
eDouble
.Da documentação de
compareTo
:fonte
a.compareTo(b)
retorna um número maior que zero sea > b
,0
sea == b
, e menor que zero sea < b
.Para ser breve:
fonte
Use o
compareTo
método de BigDecimal:fonte
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 yfonte
Aqui está um exemplo para todos os seis operadores de comparação booleanos (<, ==,>,> =,! =, <=):
fonte
BigDecimal
não é um primitivo, para que você não pode usar os<
,>
operadores. No entanto, como é umComparable
, você pode usar ocompareTo(BigDecimal)
para o mesmo efeito. Por exemplo:fonte
Usando a classe util com.ibm.etools.marshall.util.BigDecimalRange da IBM, pode-se comparar se BigDecimal no intervalo.
fonte
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 umaBigDecimal
instância com um valor que não é exatamente0.8
e que tem uma escala de 50+,new BigDecimal("0.8")
irá criar umaBigDecimal
instância com um valor que é exato0.8
e 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
BigDecimal
instâncias com oBigDecimal(String val)
construtor ou oBigDecimal.valueOf(double val)
método em vez doBigDecimal(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) .fonte