Considere la clase de prueba simple:
import java.math.BigDecimal;
/**
* @author The Elite Gentleman
*
*/
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal x = new BigDecimal("1");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y));
System.out.println(x.compareTo(y) == 0 ? "true": "false");
}
}
Puede (conscientemente) decir que x
es igual a y
(no referencia de objeto), pero cuando ejecuta el programa, el siguiente resultado muestra:
false
true
Pregunta: ¿Cuál es la diferencia entre compareTo()
y equals()
en BigDecimal
que compareTo
puede determinar que x
es igual a y
?
PD: Veo que BigDecimal tiene un inflate()
método en equals()
método. ¿Qué hace en inflate()
realidad?
java
equals
bigdecimal
compareto
Buhake Sindi
fuente
fuente
inflate()
: no es parte de la API pública porque solo manipula la representación interna y no tiene ningún efecto visible en el "exterior". Entonces, a menos que realmente desee estudiar la implementaciónBigDecimal
en profundidad, le sugiero que ignore este método.Respuestas:
La respuesta está en el JavaDoc del
equals()
método :En otras palabras:
equals()
comprueba si losBigDecimal
objetos son exactamente iguales en todos los aspectos.compareTo()
"solo" compara su valor numérico.En cuanto a por qué se
equals()
comporta de esta manera, esto se ha respondido en esta pregunta SO .fuente
BigDecimal
si no lee el JavaDoc con cuidado. :) - Obtuvimos algunos errores extraños de esto hasta que nos dimos cuenta de la diferencia.BigDecimal
Es una de esas cosas. Por lo tanto, siempre se debe verificar el JavaDoc. Al menos una vez que descubres que algo extraño está sucediendo.Básicamente,
inflate()
llamaBigInteger.valueOf(intCompact)
si es necesario, es decir, crea el valor sin escala que se almacena comoBigInteger
desdelong intCompact
. Si no lo necesitaBigInteger
y el valor sin escala se ajusta a un,long
BigDecimal
parece que intenta ahorrar espacio el mayor tiempo posible.fuente
BigDecimal
mantiene su valor sin escala tanto en unlong
como en unBigInteger
. SiBigInteger
no se necesita internamente, no se crea, pero si es necesario (por ejemplo, cuando seequals
encuentra un inflado inflado y no infladoBigDecimal)
() se usa para crearlo. - Para resumir:inflate()
maneja las conversiones internas si es necesario y ya es privado, no debería importar a los usuarios de la clase.Creo que la respuesta correcta sería hacer que los dos números (BigDecimals) tengan la misma escala y luego podamos decidir sobre su igualdad. Por ejemplo, ¿son iguales estos dos números?
Bueno, depende de la escala. En la escala 5 (5 puntos decimales), no, no son lo mismo. pero en precisiones decimales más pequeñas (escala 4 e inferior) se consideran iguales. Así que sugiero que la escala de los dos números sea igual y luego compararlos.
fuente
También puedes comparar con doble valor
fuente