nao sei se estou tendo uma ilusao,
mas façam o seguinte teste:
[code] public static void main(String[] args) {
double x = 0.04;
double y = 9.68;
System.out.println((x + y));
}[/code]
executando este codigo, o resultado é: 9.719999999999999
algum motivo para nao resultar em 9.72 ???
grato,
Rafael
Perda de precisão.
Esses números são dízimas em binário.
certo, como resolver??
sem utilizar BigDecimal teria como!?
[]s
Sim… números fracionários não tem precisão em binário.
A coisa fica ainda pior se vc multiplicar números divididos.
Dá uma lida nessa thread para entender melhor:
http://www.guj.com.br/posts/list/68086.java#357907
Se poucas casas de precisão são suficientes para você:
- Multiplique antes de dividir;
- Use as funções Math.round, Math.ceil e Math.floor.
Vini, isso não serve?
DecimalFormat df = new DecimalFormat("#.##");
double d1 = 0.04;
double d2 = 9.68;
double d3 = d1 + d2;
System.out.println(d3);
System.out.println(df.format(d3));
Saída:
9.719999999999999
9,72
Editado: Bom, se você for usar o valor pra outras coisas, acho que pode dar problema…
bom pessoal, sinceramente nao sei o que fazer …
nenhuma das solucoes resolveu …
as funcoes ceil e rounf arredondam para numeros inteiros…
formatar o numero tbm nao adiantaria, pq preciso dele para fazer as contas … é um processo de calculo complexo e longo …
mas a possibilidade utilizar 2 casas decimais no processo é valida …
[]s
Qual o problema de fazer todas as contas com números quebrados e só arredondar no final, para exibir o resultado?
vou fazer alguns testes, mas por algum motivo, mesmo fazendo como vc citou, nao bate os resultados finais …
mesmo assim, obrigado …
[]s
Rafael
[code]DecimalFormat df = new DecimalFormat("#.##");
double d1 = 0.04;
double d2 = 9.68;
double d3 = d1 + d2; // 9.72
System.out.println(d3);
double d4 = d3 + d1; // 9.76
System.out.println(d4);
double d5 = d4 + d2; // 19.44
System.out.println(d5);
double d6 = d5 + d1; // 19.48
System.out.println(d6);
System.out.println(df.format(d6));[/code]