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.