setscale multiply example java double precision bigdecimal zero

multiply - java bigdecimal divide



Es igual al operador para ceros(BigDecimal/Double) en Java (7)

  1. El 0 en su primera expresión se interpreta como un int , que puede ser autoboxado en un Integer , pero no en un Double . Entonces el tipo de los dos es diferente, por lo tanto, no son iguales. OTOH 0.0 es un double , que se autoboxa en un Double , por lo que los dos operandos se consideran iguales.

  2. BigDecimals también contiene una escala (es decir, número de dígitos a la derecha del punto del separador decimal). BigDecimal.ZERO tiene el valor de "0", por lo que su escala es 0. Por lo tanto, no es igual a "0.0", cuya escala es 1.
    Si quiere comparar valores, use BigDecimal.compareTo :

    BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0

Algunas observaciones interesantes wrt es igual a operador en 0 y 0.0

  1. new Double(0.0).equals(0) devuelve falso, mientras que el new Double(0.0).equals(0.0) devuelve verdadero.

  2. BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0)) devuelve falso, mientras que BigDecimal.ZERO.equals(BigDecimal.valueOf(0)) devuelve verdadero.

Parece que la comparación de cadenas se está realizando en ambos casos. ¿Alguien podría arrojar algo de luz sobre esto?

Gracias.


BigDecimal ''iguales'' compara el valor y la escala. Si solo desea comparar valores (0 == 0.0), debe usar compareTo:

BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true

Ver el javadoc .

En cuanto a la comparación doble, como se explica en otras respuestas, está comparando un doble con un entero en el new Double(0.0).equals(0) , que devuelve false porque los objetos tienen diferentes tipos. Como referencia, el código para el método equals en JDK 7 es:

public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); }

En tu caso, (obj instanceof Double) es falso.


Para consideraciones de rendimiento, BigDecimal, BigInteger almacena en caché pequeños valores de 0 a 15 en el caso de BigDecimal (sin fracciones)

BigDecimal.ZERO será el nuevo BigDecimal (BigInteger.ZERO, 0, 0, 1) y el método valueOf generalmente recoge de la memoria caché de 0 a 15 :)


nuevo Double (0.0) .equals (0) en realidad está encasillado como algo como esto:

new Double(0.0).equals(Integer.valueOf(0))

Double.equals (...) nunca volverá verdadero a menos que se le dé otra instancia doble.


new Double(0.0).equals(0)

Esta línea compara un valor doble de 0 (que no es cero exacto) con un número entero de 0.

BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))

BigDecimal comparará la longitud de la escala en la operación de iguales.


new Double(0.0).equals(0); //false

como el argumento que aprobó es un número entero. y los equels () en la clase doble verifican si el argumento es una instancia od Doble o no está usando una instancia de operador.

El método doble de () de Double .

if (!(argument instanceof Double)) return false;

El argumento que aprobó es un número entero , que no es una instancia de Double , por lo que devuelve false.


please try doublevalue instead of compareto if you feel is not as beautiful and readable as or simply need an alternative like below: BigDecimal a = new BigDecimal("0.00"); BigDecimal b = new BigDecimal("0.0"); BigDecimal c = new BigDecimal("0"); if(a.doubleValue()==BigDecimal.ZERO.doubleValue()) { System.out.println("a equals"); } if(b.doubleValue()==BigDecimal.ZERO.doubleValue()) { System.out.println("b equals"); } if(c.doubleValue()==BigDecimal.ZERO.doubleValue()) { System.out.println("c equals"); }