multiply - java bigdecimal divide
Es igual al operador para ceros(BigDecimal/Double) en Java (7)
El 0 en su primera expresión se interpreta como un
int
, que puede ser autoboxado en unInteger
, pero no en unDouble
. Entonces el tipo de los dos es diferente, por lo tanto, no son iguales. OTOH0.0
es undouble
, que se autoboxa en unDouble
, por lo que los dos operandos se consideran iguales.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, useBigDecimal.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
new Double(0.0).equals(0)
devuelve falso, mientras que elnew Double(0.0).equals(0.0)
devuelve verdadero.BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))
devuelve falso, mientras queBigDecimal.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");
}