BigDecimal ser o uso de ponto flutuante erro de cálculo preciso e uso adequado

prefácio

Geralmente relacionada com a computação empresarial fracionário, vamos usar BigDecimal para completar a adição e subtração multiplicação e divisão. No entanto, quando se utiliza uma aritmética de ponto flutuante de precisão BigDecimal, observar o método correto. Se o método selecionado corretamente, o erro ainda ocorrer.

Encontrado o problema

Aqui Insert Picture Descrição
O método de testar um BigDecimal duas configurações, um resultado diferente foi encontrado operação de ponto flutuante. BigDecimal.valueOf método de construção de um objecto utilizando um método, flutuante excepção precisão ponto ocorreu é obtido. Usando novo método BigDecimal (String Val), o funcionamento correcto.

causas

Ver código fonte BigDecimal.valueOf, podemos encontrar o problema. BigDecimal.valueOf (9.9f), a chamada de método real é: java.math.BigDecimal # valueOf (duplo). Como mostrado na FIG.

Aqui Insert Picture Descrição
Multi-passo elenco de ação do que pensávamos. 9.9f serão lançados para o dobro. Testar esse elenco, podemos encontrar o problema, de fato, o elenco aqui. resultados expressos são mostrados na FIG.
Aqui Insert Picture Descrição

expandir

Se o parâmetro é o dobro tipo, usamos BigDecimal.valueOf (...) pode fazer?

Aqui Insert Picture Descrição
resultado visual não é problema. No entanto, a fonte nota BigDecimal.valueOf (...), que ainda está dentro da cadeia de caracteres convertida em dados de referência correspondentes ao dobro. Se o uso direto de novo BigDecimal (double val) calcula construtor, os resultados vão ser encontradas para ocorrer uma exceção de precisão. Como mostrado na FIG.
Aqui Insert Picture Descrição
As notas podem ser vistas dentro do jdk, foi descrito, os resultados da nova BigDecimal (double val) get método é imprevisível. O tipo de parâmetro recomendado para o construtor de Cordas cálculo preciso de números de ponto flutuante.
Aqui Insert Picture Descrição

resumo

Diferente 1, ao usar BigDecimal cálculos científicos, precisamos ser claros, BigDecimal.valueOf (...) e nova BigDecimal (...) uso de efeitos. Quando BigDecimal.valueOf (...) do tempo de referência é um tipo float, BigDecimal colocado no elenco de referência para o dobro. 2, utilizando o novo BigDecimal (String val) para se obter o correspondente flutuador BigDecimal objetos, completando assim a aritmética de ponto flutuante de precisão.

Acho que você gosta

Origin juejin.im/post/5e86085ce51d4547153d0769
Recomendado
Clasificación