Duvida na soma de double

9 respostas
R

nao sei se estou tendo uma ilusao,

mas façam o seguinte teste:

public static void main(String[] args) {
	
	double x = 0.04;
	double y = 9.68;
	
	System.out.println((x + y));
    }

executando este codigo, o resultado é: 9.719999999999999

algum motivo para nao resultar em 9.72 ???????

grato,

Rafael

9 Respostas

S

Perda de precisão.
Esses números são dízimas em binário.

R

certo, como resolver??

sem utilizar BigDecimal teria como!?

[]s

ViniGodoy

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

ViniGodoy

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.
S

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…

R

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

ViniGodoy

Qual o problema de fazer todas as contas com números quebrados e só arredondar no final, para exibir o resultado?

R

vou fazer alguns testes, mas por algum motivo, mesmo fazendo como vc citou, nao bate os resultados finais …

mesmo assim, obrigado …

[]s

Rafael

S
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));
Criado 14 de março de 2008
Ultima resposta 14 de mar. de 2008
Respostas 9
Participantes 3