Compare si BigDecimal es mayor que cero

245

¿Cómo puedo comparar si el BigDecimalvalor es mayor que cero?

Santhosh
fuente
1
mira en github.com/mortezaadi/bigdecimal-utils hay un método isPositive () también hay como is (bigdecimal) .isZero (); es (bigdecimal) .notZero (); es (bigdecimal) .isPositive (); // mayor que cero es (bigdecimal) .isNegative (); // menor que cero es (bigdecimal) .isNonPositive (); // menor o igual a cero es (bigdecimal) .isNonNegative ();
Morteza Adi
@MortezaAdi ya que BigDecimalimplementa Comparablelas funciones de comparación como lt, le, eq, nemejor moverlo a a ComparableUtils. Por lo tanto, se pueden usar para cualquier otra clase Dateo tipo personalizado.
djmj
Los requisitos de @djmj definen la implementación, no hubo necesidad ni intención de construir ComparableUtils. Además de la funcionalidad de lt, le, eq, etc., son totalmente diferentes a las genéricas.
Morteza Adi

Respuestas:

401

Es tan simple como:

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

La documentación paracompareTo realmente especifica que devolverá -1, 0 o 1, pero el Comparable<T>.compareTométodo más general solo garantiza menos que cero, cero o mayor que cero para los tres casos apropiados, por lo que generalmente me limito a esa comparación.

Jon Skeet
fuente
50
Se requiere una palabra adicional de advertencia. Supongamos que valuetiene un valor de cero pero una escala distinta de cero (por ejemplo, se evalúa en 0.00lugar de 0). Probablemente quieras considerar que es igual a cero. El compareTo()método efectivamente hará esto. Pero el equals()método no lo hará. (Otra prueba, si fuera necesaria, de que Loki o uno de sus avatares está vivo y bien y se ha trasladado al desarrollo de software)
Andrew Spencer,
99
Si bien estoy de acuerdo en que esta es la solución idiomática en Java, no creo que sea realmente legible. Cada vez que encuentro una expresión como esta, me encuentro escribiendo un examen para asegurarme de que lo he entendido bien. Quizás el hecho de que las clases agregadas recientemente, como LocalDateinclude, isBeforesea ​​una indicación de que Oracle siente lo mismo. No es lo ideal, pero creo que es marginalmente más legible en estas circunstancias escribir un isGreaterThanmétodo de utilidad .
Mark Slater
¿La solución @Jon Skeet también funciona si el valor es 0.00 o 0.0?
Angelina
1
@Angelina: Ciertamente lo esperaría, esos valores no son mayores que 0, por lo que esperaría compareTodevolver 0. Pero si está preocupado, debería ser fácil para usted probar.
Jon Skeet
@MarkSlater Estoy de acuerdo, el compareTo es solo que Java debería invertir más tiempo en mejorar la legibilidad y no tiene sentido si todos tienen que crear sus propios métodos legibles en cada proyecto. En C # también puede crear métodos de extensión para clases existentes para que pueda usar directamente `value.isGreaterThen (foo)` `
djmj
165

Posible mejor manera :

if (value.signum() > 0)
Anton Bessonov
fuente
12
BigDecimal.compareTo () comienza comparando signums como una optimización. Por lo tanto, probablemente sea mejor llamar a compareTo (), ya que es más revelador de intenciones y solo cuesta el precio de una llamada de método adicional (que sospecho que se alinearía de todos modos).
Andrew Spencer
27
Esto es parte de la API pública. así que, para mí, es una mejor manera. la intención ES determinar si el signo es positivo (es decir, CERO)
Marc
¿Crees que es un mayor rendimiento si solo toma el primer carácter de un Stringinicializado BigDecimalpara ver si es -o no? Esa es mi mejor suposición de cómo podría funcionar. Parece más rápido para determinar realmente si el número es 0. ¿Es esto correcto? Muchas gracias de antemano Anton Bessonov!
55
Si observa el BigDecimal.compareTo()método descompilado , encontrará que llama signum()dos veces. Por lo que respecta al rendimiento, signum()es mejor.
Miércoles
1
¿Cuál fue su problema con los casos decimales? @jfajunior
İsmail Yavuz
11

Use la compareTo()función que está integrada en la clase.

duffymo
fuente
1

es más seguro usar el método compareTo()

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

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

impresión de consola

    result ==> 1

compareTo() devoluciones

  • 1 si a es mayor que b
  • -1 si b es menor que b
  • 0 si a es igual a b

ahora para tu problema puedes usar

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

o

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

Espero que te haya ayudado.

yOshi
fuente
0

el uso de ".intValue ()" en el objeto BigDecimal no es correcto cuando desea verificar si es mayor que cero. La única opción que queda es el método ".compareTo ()".

Satya M
fuente
-2
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");
Rama Krishna
fuente
El obj contiene una cadena numérica. En la respuesta aceptada, el valor no se declara, puede ser confuso. Mi respuesta tendrá más claridad.
Rama Krishna