1. Introdução ao BigDecimal
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 é ( unscaledValue × 10-scale ).
2. Introdução de BigDecimal
Ao usar linguagens de programação Java, como bancos e finanças, que requerem cálculo de alta precisão de valores numéricos, geralmente usamos BigDecimal e BigInteger em vez dos tipos comuns int , long , float e double , especialmente ao lidar com dados de ponto flutuante.
Vamos primeiro dar uma olhada em uma demonstração de código do uso do tipo de dados básico double para os resultados de cálculo e impressão:
classe pública mainClass {public static void main (string [] args) {System.out.println (0,02+0,01); System.out.println (0,05+0,01); }}Os resultados são os seguintes:
0.030.060000000000000000000000005
A questão é: por que os dados com o segundo resultado aparecem? A razão fundamental é que nosso computador é binário e o binário não pode representar com precisão um número de ponto flutuante. Existem certos erros quando a CPU usa o método "mandril e expoente" (método de notação científica) para expressar números de ponto flutuante. Portanto, quando os requisitos de precisão dos dados são relativamente altos, a classe BigDecimal ainda precisa ser usada, embora a velocidade de cálculo seja um pouco mais lenta.
3.BigDecimal Uso
Existem duas maneiras de criar um objeto BigDecimal: Construtor e Método estático público ( BigDecimal.valueOf ). Dois pontos precisam receber atenção a:
1. O construtor inclui dois formulários que usam tipos e strings básicos de dados como parâmetros. Este último é recomendado, como: new BigDecimal(Double.valueOf(0.09)) . Você pode tentar. O resultado da saída System.out.println(new BigDecimal(0.06).toString()); A declaração é: 0.059999999999999999999777955395074968691919152736663818359375
xxxValue() doubleValue() toString()
4. Modo de arredondamento bigdecimal
Embora o banco de dados armazene um número de ponto flutuante de alta precisão, geralmente é necessário limitar o número de dígitos decimais quando exibidos em aplicativos, como dois a três decimais. No momento, você precisa usar a função SetScale ( int newScale, int roundingMode ). Como uma variável estática pública do BigDecimal, existem muitas regras de operação para o modo de arredondamento (modo de arredondamento) e há oito tipos públicos. Aqui está uma explicação, e o documento oficial também o apresenta.
1. Round_up
Longe de zero. Abandone a parte diferente de zero e adicione um número adjacente à parte diferente de zero.
2. Round_down
Rodar na direção próxima a zero. Abandone a parte diferente de zero e, ao mesmo tempo, o número adjacente da peça não será descartado adicionando um à parte diferente de zero e interceptando o comportamento.
3. Round_Ceia
Rodada na direção do infinito. Se for um número positivo, o resultado de arredondamento é o mesmo que ROURD_UP; Se for um número negativo, o resultado de arredondamento é o mesmo que Round_down. Nota: Este modo não reduz o tamanho do valor.
4. Round_floor
Rodada na direção de infinito negativo. Se for um número positivo, o resultado de arredondamento é o mesmo que Round_down; Se for um número negativo, o resultado de arredondamento é o mesmo que Round_Up. Nota: Este modo não aumenta o tamanho do valor.
5. RODOD_HALF_UP
O arredondamento para o número "mais próximo" é um modo de arredondamento de arredondamento para cima se a distância para dois números adjacentes for igual. Se a peça for descartada> = 0,5, o comportamento de arredondamento será o mesmo que round_up; Caso contrário, o comportamento de arredondamento é o mesmo que Round_down. Esse padrão é o que chamamos de "arredondamento".
6. redond_half_down
O arredondamento para o número "mais próximo", se a distância de dois números adjacentes for igual, for um modo de arredondamento de arredondamento. Se a parte descartada> 0,5, o comportamento de arredondamento será o mesmo que ROUND_UP; Caso contrário, o comportamento de arredondamento é o mesmo que Round_down. Este modelo é o que costumamos chamar de "arredondamentos".
7. ROUR_HALF_EVEN
Ao redor do número "mais próximo", se a distância de dois números adjacentes for igual, os números pares adjacentes serão arredondados. Se o número ímpar à esquerda da peça for descartado, o comportamento de arredondamento será o mesmo que round_half_up; Se for um número par, o comportamento de arredondamento é o mesmo que Round_Half_Down. Nota: Este modo de arredondamento minimiza o erro de acumulação quando repetidas séries de cálculos. Esse modo de arredondamento também é chamado de "método de arredondamento de banqueiro" e é usado principalmente nos Estados Unidos. Rodada seis em seis e cinco em duas situações. Se o anterior for um número ímpar, ele entrará na posição, caso contrário, será abandonado.
8. ROUND_UNNENCESSARY
A operação da solicitação de asserção possui resultados precisos, portanto o arredondamento não é necessário. Se esse modo de arredondamento for especificado para uma operação que obtém o resultado exato, uma aritmeticexception será lançada.
Abaixo, vamos dar um exemplo para ilustrar o cálculo numérico resulta em diferentes modos de arredondamento, mantendo um decimal:
5. Resumo
O exposto acima é toda a introdução dos modos BigDecimal e oito arredondamentos de Java. Espero que o conteúdo deste artigo seja útil para todos para aprender Java.