Considere a classe de teste simples:
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");
}
}
Você pode (conscientemente) dizer que x
é igual a y
(não referência a objeto), mas quando você executa o programa, o seguinte resultado mostra:
false
true
Pergunta: Qual é a diferença entre compareTo()
e equals()
em BigDecimal
que compareTo
pode determinar que x
é igual a y
?
PS: Vejo que o BigDecimal tem um inflate()
método no equals()
método O que inflate()
faz realmente?
java
equals
bigdecimal
compareto
Buhake Sindi
fonte
fonte
inflate()
: não faz parte da API pública porque manipula apenas a representação interna e não tem efeito visível para o "exterior". Portanto, a menos que você queira realmente estudar a implementaçãoBigDecimal
em profundidade, sugiro que você ignore esse método.Respostas:
A resposta está no JavaDoc do
equals()
método :Em outras palavras:
equals()
verifica se osBigDecimal
objetos são exatamente iguais em todos os aspectos.compareTo()
"only" compara seu valor numérico.Quanto ao porquê
equals()
se comportar dessa maneira, isso foi respondido nesta pergunta do SO .fonte
BigDecimal
se você não ler o JavaDoc com atenção. :) - Temos alguns erros estranhos até percebermos a diferença.BigDecimal
é uma dessas coisas. Portanto, deve-se sempre verificar o JavaDoc. Pelo menos uma vez que você descobrir algo estranho está acontecendo.Basicamente,
inflate()
chama ,BigInteger.valueOf(intCompact)
se necessário, ou seja, cria o valor não escalado que é armazenado como umBigInteger
delong intCompact
. Se você não precisar dissoBigInteger
e o valor não dimensionado se encaixar em um,long
BigDecimal
parece tentar economizar espaço o máximo de tempo possível.fonte
BigDecimal
mantém seu valor não dimensionado em umlong
e em outroBigInteger
. SeBigInteger
não for necessário internamente, ele não será criado, mas será necessário (por exemplo, quandoequals
encontrar um inflado inflado e não infladoBigDecimal)
() `é usado para criá-lo. - Para resumir:inflate()
trata de conversões internas, se necessário e é privado, isso não deve importar para os usuários da classe #Acredito que a resposta correta seria fazer com que os dois números (BigDecimals) tenham a mesma escala, para que possamos decidir sobre sua igualdade. Por exemplo, esses dois números são iguais?
Bem, isso depende da escala. Na escala 5 (5 casas decimais), não, eles não são os mesmos. mas em precisões decimais menores (escala 4 e inferior) são consideradas iguais. Então, sugiro que a escala dos dois números seja igual e depois compare-os.
fonte
Você também pode comparar com valor duplo
fonte