¿Cómo comprobar si la variable BigDecimal == 0 en Java?

4 minutos de lectura

avatar de usuario
Jojo

Tengo el siguiente código en Java;

BigDecimal price; // assigned elsewhere

if (price.compareTo(new BigDecimal("0.00")) == 0) {
    return true;
}

¿Cuál es la mejor manera de escribir la condición if?

  • Muchas respuestas sugieren usar el método .equals() de BigDecimal. Pero ese método tiene en cuenta la escala, por lo que no es equivalente a usar compareTo().

    – Perro Griffey

    8 de junio de 2012 a las 15:09

avatar de usuario
bohemio

Usar compareTo(BigDecimal.ZERO) en vez de equals():

if (price.compareTo(BigDecimal.ZERO) == 0) // see below

Comparando con el BigDecimal constante BigDecimal.ZERO evita tener que construir un new BigDecimal(0) cada ejecución.

para tu información, BigDecimal también tiene constantes BigDecimal.ONE y BigDecimal.TEN por su conveniencia.


¡Nota!

La razón por la que no puedes usar BigDecimal#equals() es que se necesita escala en consideración:

new BigDecimal("0").equals(BigDecimal.ZERO) // true
new BigDecimal("0.00").equals(BigDecimal.ZERO) // false!

por lo que no es adecuado para una comparación puramente numérica. Sin embargo, BigDecimal.compareTo() no considera la escala al comparar:

new BigDecimal("0").compareTo(BigDecimal.ZERO) == 0 // true
new BigDecimal("0.00").compareTo(BigDecimal.ZERO) == 0 // true

  • BigDecimal.ZERO.compareTo(precio) == 0

    – Jackkobec

    27 de enero de 2020 a las 14:53

  • ¿Hay alguna razón particular para esta implementación de BigDecimal – “new BigDecimal(“0.00″).equals(BigDecimal.ZERO) // false!”? ¿Por qué 0.00 no se reduce a 0 con escala 0?

    – Pavel

    3 de diciembre de 2020 a las 10:13


  • @Pavel todo está en el documentación.

    – bohemio

    3 de diciembre de 2020 a las 17:44

  • ¡extraño! precio == BigDecimal.valueOf(0.00d) no es cierto cuando el precio es cero.

    – Mehrnoosh

    20 mayo 2021 a las 10:50

  • @Mehrnoosh nunca lo será porque en Java == compara la identidad del objeto, es decir, si es el mismo objeto, no si los dos lados tienen el mismo valor. En Java, siempre use .equals() para comparar cosas.

    – bohemio

    20 mayo 2021 a las 15:50


avatar de usuario
kman

Alternativamente, signum() puede ser usado:

if (price.signum() == 0) {
    return true;
}

  • Tal vez sea más rápido, pero compareTo(BigDecimal.ZERO) es más legible.

    – ElYeante

    6 de marzo de 2014 a las 10:46

  • @ElYeante, siempre puede envolver esto con un método, que tiene un nombre más legible, o incluso describe parte de su lógica comercial, conectado con dicha comparación

    – WeGa

    7 abr 2016 a las 10:53

  • Desafortunadamente, signum() no es seguro contra nulos, mientras que compareTo sí lo es, cuando se compara como BigDecimal.ZERO.compareTo(), así que preste atención a eso

    – WeGa

    18 oct 2016 a las 8:10

  • @WeGa Eso no es cierto: BigDecimal.ZERO.compareTo(null) lanzará NPE

    – ACV

    6 de abril de 2017 a las 14:16

  • @ACV, gracias por su vigilancia. Mirando el código fuente, compareTo() solo espera un argumento no nulo.

    – WeGa

    10 de abril de 2017 a las 8:01

avatar de usuario
pablochan

Hay una constante con la que se puede comprobar:

someBigDecimal.compareTo(BigDecimal.ZERO) == 0

  • Se solicita permiso para robar su terminología de una “condición de Yoda”.

    – SimplementePanda

    8 de junio de 2012 a las 14:44

  • Esto es fantástico.

    – SimplementePanda

    8 de junio de 2012 a las 15:13

  • El comportamiento de Java BigDecimal de equals y compareTo no es como crees. docs.oracle.com/javase/1.5.0/docs/api/java/math/…

    – nhahtdh

    31 de agosto de 2012 a las 1:53

  • El compareTo de BigDecimal aún arrojará una excepción si pasa un valor nulo.

    – Juan Jiang

    7 de febrero de 2013 a las 5:55

avatar de usuario
Edwin Dalorzo

Alternativamente, creo que vale la pena mencionar que el comportamiento de los métodos equals y compareTo en la clase BigDecimal no son consistentes entre si.

Esto básicamente significa que:

BigDecimal someValue = new BigDecimal("0.00");
System.out.println(someValue.compareTo(BigDecimal.ZERO) == 0); // true
System.out.println(someValue.equals(BigDecimal.ZERO)); // false

Por lo tanto, hay que tener mucho cuidado con la báscula en tu someValue variable, de lo contrario obtendría resultados inesperados.

Usualmente uso lo siguiente:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0) { ... }

avatar de usuario
andrii abramov

Querrías usar equals() ya que son objetos, y utilizan el construido en ZERO instancia:

if (selectPrice.equals(BigDecimal.ZERO))

Tenga en cuenta que .equals() tiene en cuenta la escala, por lo que, a menos que selectPrice tenga la misma escala (0) que .ZERO entonces esto devolverá falso.

Para eliminar la escala de la ecuación, por así decirlo:

if (selectPrice.compareTo(BigDecimal.ZERO) == 0)

Debo señalar que para ciertas situaciones matemáticas, 0.00 != 0por eso imagino .equals() tiene en cuenta la escala. 0.00 da precisión al lugar de las centésimas, mientras que 0 no es tan preciso. Dependiendo de la situación, es posible que desee seguir con .equals().

avatar de usuario
Félix Maroy

Una manera simple y mejor para su ejemplo es:

BigDecimal price;

if(BigDecimal.ZERO.compareTo(price) == 0){
    
   //Returns TRUE

}

  • Golpea por la única solución nula segura.

    – Kekzpanda

    3 de septiembre de 2021 a las 11:04

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad