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 xes 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 BigDecimalque compareTopuede determinar que xes 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ónBigDecimalen 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 losBigDecimalobjetos 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
BigDecimalsi no lee el JavaDoc con cuidado. :) - Obtuvimos algunos errores extraños de esto hasta que nos dimos cuenta de la diferencia.BigDecimalEs 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 comoBigIntegerdesdelong intCompact. Si no lo necesitaBigIntegery el valor sin escala se ajusta a un,longBigDecimalparece que intenta ahorrar espacio el mayor tiempo posible.fuente
BigDecimalmantiene su valor sin escala tanto en unlongcomo en unBigInteger. SiBigIntegerno se necesita internamente, no se crea, pero si es necesario (por ejemplo, cuando seequalsencuentra 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