Houve um problema ao lidar com a verificação do valor do pagamento nos últimos dois dias. Eu usei o método igual a BigDecimal para comparar se as duas quantidades são iguais, o que resultou em um erro na comparação da quantidade (como a comparação entre 3,0 e 3,00, etc.).
[NOTA: A seguir, a seguinte é sobre o Sun JDK versão 1.4.2 como exemplo. A implementação de outras versões pode não ser consistente, ignore -a]
Primeiro, vamos dar uma olhada no método igual de BigDecimal:
public boolean é igual a (objeto x) {if (! (x instância de bigdecimal)) retorna false; bigdecimal xdec = (bigdecimal) x; retorno escala == xdec.scale && intval.equals (xdec.intval); }Você pode ver que o método Euquals da BigDecimal é primeiro determinar o tipo de dados a ser comparado. Se os tipos de objeto forem consistentes, é determinado ao mesmo tempo se a precisão (escala) e o valor (o método Biginteger da Biginteger) são consistentes.
De fato, já está muito claro no Javadoc: "compara esse bigdecimal com o objeto especificado para a igualdade. Ao contrário do Compareto, esse método considera dois objetos BigDecimal iguais apenas se forem iguais em valor e escala (portanto, 2,0 não é igual a 2,00 quando comparados por esse método)". Eu só não prestei atenção!
Vamos dar uma olhada no método compareto:
public int compareto (vale bigdecimal) {/ * otimização: funcionaria bem sem as próximas três linhas */int sigdiff = signo () - val.signum (); if (sigdiff! este; arg [1] = val; MatchScale (arg); retorno arg [0] .intVal.compareto (arg [1] .intval); } Você pode ver que existe um processamento de escala de correspondência neste método, o que significa converter o objeto com baixa precisão em alta precisão e, em seguida, compará -lo (também o método compareto de Biginteger). A implementação do MatchScale é a seguinte:
MatchScale privado de void estático (BigDecimal [] val) {if (val [0] .Scale <val [1] .scale) val [0] = val [0] .SetScale (Val [1] .Scale); else (Val [1] .Scale <Val [0] .Scale) Val [1] = Val [1]. } Faça um teste simples:
System.out.println (novo BigDecimal ("1.2"). Iguals (novo BigDecimal ("1.20"))); // output Falsesystem.out.println (novo bigdecimal ("1.2"). Compareto (novo bigdecimal ("1.20")) == 0); // saída true Também notei que o construtor BigDecimal acima é passado em cordas. Se o passado passou em número, o que acontecerá? Você pode testá -lo e analisar os motivos:
System.out.println (novo BigDecimal ("1.2"). Iguals (novo BigDecimal ("1.20"))); // output Falsesystem.out.println (novo bigdecimal ("1.2"). Compareto (novo bigdecimal ("1.20")) == 0); // output true system.out.println (novo bigdecimal (1.2) .equals (novo bigdecimal ("1.20"))); // saída é? System.out.println (novo bigdecimal (1.2) .compareto (novo bigdecimal ("1.20")) == 0); // é a saída? System.out.println (novo BigDecimal (1.2) .Equals (novo BigDecimal (1.20))); // é a saída? System.out.println (novo bigdecimal (1.2) .compareto (novo bigdecimal (1.20)) == 0); // é a saída?A conclusão final é: para a comparação de tamanho da BigDecimal, o uso do método igual não apenas comparará o tamanho do valor, mas também comparará a precisão dos dois objetos. O método compareto não comparará a precisão, mas comparará apenas o tamanho do valor.
Finalmente, eu me desprezo. Eu usei o idioma Java há tantos anos e nem descobri o senso comum básico!
O artigo acima fala brevemente sobre a diferença entre iguais e compareto da BigDecimal em Java é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.