Introdução ao BigDecimal
A explicação no documento JDK (chinês) é a seguinte:
Número decimal imutável e assinado de precisão arbitrária. O BigDecimal consiste em um valor não escala inteiro de qualquer precisão e uma escala inteira de 32 bits. Se for zero ou positivo, a escala é o número de dígitos após o ponto decimal. Se for um número negativo, multiplique o valor não de escala do número por uma potência de escala negativa de 10. Portanto, o valor representado pelo BigDecimal é (não-escaledValue × 10-escala).
Explicação específica
1. "O valor do objeto BigDecimal é imutável". Isso mostra esse recurso na função de operação do objeto BigDecimal:
A cópia do código é a seguinte: bigdecimal a = novo bigdecimal ("1.22");
System.out.println ("Construa com um valor de string:" + a);
Bigdecimal b = novo bigdecimal ("2.22");
A.Add (B);
System.out.println ("a mais b é:" + a);
É fácil pensar que será lançado:
Construa com um StringValue: 1.22
a mais B é: 3,44
Mas, de fato, um mais B é: 1,22
2. "O BigDecimal consiste em um valor não escala inteiro de qualquer precisão e uma escala inteira de 32 bits. Se o valor da escala for zero ou positivo, a escala será o número de dígitos após o ponto decimal". Esta frase pode ser lida assim:
Por exemplo: -12 e 13.412
Expresso como: -12 × 10-0 e 13412 × 10-3
Aqui (valores e escalas sem escala) são representados como: [-12, 0] e [13412, 3], respectivamente, respectivamente
3. "Se o valor da escala for um número negativo, multiplique o valor não em escala do número por uma potência de escala negativa de 10". Esta frase pode ser lida assim:
Por exemplo: 120.00
Este valor é expresso como: 12000 × 10-2
Aqui (valor e escala sem escala) são expressos como: [12000, 2]
O valor da escala aqui ainda é positivo 2, mas execute as seguintes operações:
Valor bigdecimal = novo bigdecimal ("-120,00");
// retorna numérico bigdecimal igual a esse decimal, mas remove todos os zeros da cauda dessa representação.
vale = vale.striptrailingzeros ();
Este valor é expresso como: 12 × 10-(-1)
Aqui (valor e escala sem escala) são expressos como: [12, -1]
Notas sobre o uso
1. Construtor
A cópia do código é a seguinte: AddDecimal aduble = new BigDecimal (1.22);
System.out.println ("Construct com um valor duplo:" + AduBle);
Bigdecimal adstring = novo bigdecimal ("1.22");
System.out.println ("Construa com um valor de string:" + adstring);
O resultado da saída é o seguinte:
Construa com um DoubleValue: 1.219999999999999999999997335464740899962430298328399658203125
Construa com um valor de string: 1.22
Descrição do JDK:
a) Os resultados do método de construção com o tipo de parâmetro duplo são imprevisíveis. Some people might think that the BigDecimal created by writing newBigDecimal(0.1) in Java is exactly equal to 0.1 (non-scaling value 1, whose scale is 1), but it is actually equal to 0.10000000000000000000000055511151231257827021181583404541015625. Isso ocorre porque 0,1 não pode ser expresso com precisão como um duplo (ou, para este caso, não pode ser expresso como qualquer decimal binário de comprimento finito). Dessa maneira, o valor passado para o método de construção não será exatamente igual a 0,1 (embora seja superficial igual a esse valor).
b) Por outro lado, o construtor de string é completamente previsível: a gravação de newbigdecimal ("0.1") criará um BigDecimal, que é exatamente o 0,1 esperado. Portanto, em comparação, geralmente é recomendável usar o construtor de strings primeiro.
c) Quando o duplo deve ser usado como fonte para o BigDecimal, observe que esse construtor fornece uma conversão precisa; Ele não fornece o mesmo resultado que: primeiro use o método Double.ToString (Double) e use o construtor BigDecimal (String). Para converter dupla em string, você também pode usar o método estático da String: string.valueof (duplo).
2. Operação. Além disso, a subtração, a multiplicação e a divisão retornam um novo objeto BigDecimal, porque o BigDecimal é imutável, e um novo objeto será gerado ao executar cada etapa da operação, então a.Add (b); Embora a operação de adição seja realizada, A não economiza o valor após a operação de adição. O uso correto deve ser A = A.Add (b);
exemplo:
Determine se o objeto BigDecimal é um número inteiro:
Copie o código da seguinte forma: private booleano isintegerValue (bigdecimal bd) {
retornar bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). escala () <= 0;
}
Por que fazer isso? Teste o seguinte exemplo:
Copie o código da seguinte forma: Valor BigDecimal = novo BigDecimal ("-120.00"); // Tente "0", "0,00", "1.00", "10.00" e "10.10", respectivamente, respectivamente
System.out.println (vale.signum ()); // positivo e negativo
System.out.println (vale.scale ()); //Escala
System.out.println (vale.striptrailingzeros (). Escala ()); // escala após zero
Referência: classe BigDecimal