Compare se BigDecimal for maior que zero


244

Como posso comparar se o BigDecimalvalor é maior que zero?


1
olhe para github.com/mortezaadi/bigdecimal-utils existe um método isPositive () e também é como é (bigdecimal) .isZero (); é (bigdecimal) .notZero (); é (bigdecimal) .isPositive (); // maior que zero é (bigdecimal) .isNegative (); // menor que zero é (bigdecimal) .isNonPositive (); // menor ou igual a zero é (bigdecimal) .isNonNegative ();
Morteza Adi

O @MortezaAdi já BigDecimalimplementa Comparableas funções de comparação, como é lt, le, eq, nemelhor ser movido para a ComparableUtils. Portanto, eles podem ser usados ​​para outras classes, como Datetipos personalizados.
djmj

Os requisitos do @djmj definem a implementação, não havia necessidade nem intenção de construir ComparableUtils. Além da funcionalidade de lt, le, eq, etc, são totalmente diferentes das genéricas.
Morteza Adi

Respostas:


400

É tão simples quanto:

if (value.compareTo(BigDecimal.ZERO) > 0)

A documentação paracompareTo realmente especifica que ele retornará -1, 0 ou 1, mas o Comparable<T>.compareTométodo mais geral só garante menos que zero, zero ou maior que zero para os três casos apropriados - então, normalmente, apenas me ater a essa comparação.


50
Uma palavra extra de aviso é necessária. Suponha que ele valuetenha um valor igual a zero, mas uma escala diferente de zero (por exemplo, avalia em 0.00vez de 0). Você provavelmente quer considerar que é igual a zero. O compareTo()método realmente fará isso. Mas o equals()método não. (Outra prova, se for o caso fosse necessário, que Loki ou um de seus avatares está vivo e bem e mudou-se para o desenvolvimento de software.)
Andrew Spencer

9
Embora eu concorde que essa seja a solução idiomática em Java, não acho que seja realmente legível. Toda vez que encontro uma expressão como essa, me pego escrevendo um teste para me assegurar de que tenho a solução certa. Talvez o fato de ter adicionado classes recentemente, como LocalDateinclude, isBeforeseja uma indicação de que o Oracle se sente da mesma maneira. Não é o ideal, mas acho que é marginalmente mais legível nessas circunstâncias escrever um isGreaterThanmétodo utilitário .
Mark Slater

Solução não @ Jon Skeet também funcionam se o valor é de 0,00 ou 0,0
Angelina

1
@ Angelina: Eu espero que certamente - esses valores não são maiores que 0, então eu espero compareToretornar 0. Mas se você estiver preocupado, deve ser fácil para você testar.
precisa

@ MarkSlater Concordo, o compareTo é que apenas o Java deve investir mais tempo para melhorar a legibilidade e não faz sentido se todos tiverem que criar seus próprios métodos legíveis em todos os projetos. Em C #, você também pode criar métodos de extensão para classes existentes, para poder usar diretamente `value.isGorgeousThen (foo)` `
djmj

164

Melhor maneira possível :

if (value.signum() > 0)

12
BigDecimal.compareTo () começa comparando signums como uma otimização. Portanto, provavelmente é melhor chamar compareTo (), pois é mais revelador de intenções e custa apenas o preço de uma chamada de método extra (que eu suspeito que seria incluída de qualquer maneira).
Andrew Spencer

27
Isso faz parte da API pública. então é, para mim, um caminho melhor. A intenção é determinar se o sinal é positivo (ie> ZERO)
Marc

Você acha que é um desempenho mais alto se ele pegar apenas o primeiro caractere de uma Stringinicializada BigDecimalpara ver se é -ou não? Esse é o meu melhor palpite de como isso poderia funcionar. Parece mais rápido para realmente determinar se o número é 0. Isso está correto? Muito obrigado antecipadamente Anton Bessonov!

5
Se você observar o BigDecimal.compareTo()método descompilado , verá que ele chama signum()duas vezes. Portanto, quanto ao desempenho, signum()é melhor.
Meir

1
Qual foi o seu problema com maiúsculas e minúsculas? @jfajunior
İsmail Yavuz

11

Use a compareTo()função incorporada à classe.


1

é mais seguro usar o método compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));

console de impressão

    result ==> 1

compareTo() retorna

  • 1 se a for maior que b
  • -1 se b for menor que b
  • 0 se a é igual a b

agora para o seu problema, você pode usar

if (value.compareTo(BigDecimal.ZERO) > 0)

ou

if (value.compareTo(new BigDecimal(0)) > 0)

Espero que tenha ajudado.


0

O uso de ".intValue ()" no objeto BigDecimal não está correto quando você deseja verificar se é maior que zero. A única opção restante é o método ".compareTo ()".


-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

O obj contém uma cadeia numarica. Na resposta aceita, o valor não é declarado, pode ser confuso. Minha resposta terá mais clareza.
Rama Krishna
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.