Duvida na soma de double

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ê:

  1. Multiplique antes de dividir;
  2. 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]