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
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.
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.expandir
Se o parâmetro é o dobro tipo, usamos BigDecimal.valueOf (...) pode fazer?
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. 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.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.