Detalhes da vida, que provocam grandes problemas

11 respostas
aurelio_silva

Depois de muita dor de cabeça, segue uma pequena simulação de um problema que não sei explicar…
Alguém já viu isso?

Double D = 10.2;	
double d = 0.0;
		
d += (10.2*100);
		   	
System.out.println(D);
System.out.println(d);

Resultado:
10.2
1019.99999999999999999

Double D = 10.2;	
double d = 0.0;
		
d += (10.2*10)*10;
		   	
System.out.println(D);
System.out.println(d);

Resultado:
10.2
1020.0

Até.

11 Respostas

mario.fts

não sei te dizer o pq do problema, mas em java o double tem um erro de precisão.

por exemplo:

double val = 0; for (int i = 0; i < 10; i++) { val += 0.1; System.out.println(val); }
saída:
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

se vc estiver precisando de precisão (essa frase ficou estranha :stuck_out_tongue: ) use a classe BigDecimal no lugar de double.

adriano_si

Tenta assim:

Double D = 10.2;
        double d = 0.0;

        d += (10.2*1000);

        System.out.println(D);
        System.out.println(d);
Depois assim
Double D = 10.2;
        double d = 0.0;

        d += (10.2*10);

        System.out.println(D);
        System.out.println(d);

Dá mais raiva ainda... ou seja a bronca é só com 100

aurelio_silva

mario.fts:
não sei te dizer o pq do problema, mas em java o double tem um erro de precisão.

por exemplo:

double val = 0; for (int i = 0; i < 10; i++) { val += 0.1; System.out.println(val); }
saída:
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

se vc estiver precisando de precisão (essa frase ficou estranha :stuck_out_tongue: ) use a classe BigDecimal no lugar de double.

Acho que é isso mesmo, porque se trocar(no meu exemplo) 10.2 por 10.3 ele funciona e se trocar 100 por 10 ou 1000 e manter 10.2, também funciona…que louco isso…

Valeu

aurelio_silva
adriano_si:
Tenta assim:
Double D = 10.2;
        double d = 0.0;

        d += (10.2*1000);

        System.out.println(D);
        System.out.println(d);
Depois assim
Double D = 10.2;
        double d = 0.0;

        d += (10.2*10);

        System.out.println(D);
        System.out.println(d);

Dá mais raiva ainda... ou seja a bronca é só com 100

Bota raiva nisso....vc não imagina como foi dificil descobrir isso..rsrs

adriano_si
BigDecimal D = new BigDecimal(10.2);
        BigDecimal d = new BigDecimal(0.0);

        d = new BigDecimal(10.2*100);

        System.out.println(D);
        System.out.println(d);

Haja precisão no BigDecimal... PQP...

run:
10.199999999999999289457264239899814128875732421875
1019.9999999999998863131622783839702606201171875
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
aurelio_silva
Olha, o método que estou trabalhando só recebe Double, pelo que estou vendo não há alguma forma de somar sem fazer a gamb de 10*10...
Double D = 10.2;      
double d = 0.0;  
         
d += (10.2*10)*10;  
               
System.out.println(D);  
System.out.println(d);

Se alguém tiver mais alguma idéia, valeu.

pmlm

http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html#format(double)

mario.fts
adriano_si:
BigDecimal D = new BigDecimal(10.2);
        BigDecimal d = new BigDecimal(0.0);

        d = new BigDecimal(10.2*100);

        System.out.println(D);
        System.out.println(d);

Haja precisão no BigDecimal... PQP...

run:
10.199999999999999289457264239899814128875732421875
1019.9999999999998863131622783839702606201171875
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)
Aqui vc tem outro problema. vc usou um double(resultado da multiplicação) para construir o bigdecimal, e o certo era fazer algo assim:
BigDecimal d = new BigDecimal("10.2").multiply(new BigDecimal("100"));

saída: 1020.0

mario.fts
aurelio_silva:
Olha, o método que estou trabalhando só recebe Double, pelo que estou vendo não há alguma forma de somar sem fazer a gamb de 10*10...
Double D = 10.2;      
double d = 0.0;  
         
d += (10.2*10)*10;  
               
System.out.println(D);  
System.out.println(d);

Se alguém tiver mais alguma idéia, valeu.

Double D = 10.2;      
		double d = 0.0; 
		
		BigDecimal numero = new BigDecimal(Double.toString(D));
		
		         
		d += numero.multiply(new BigDecimal("100")).doubleValue();  
		               
		System.out.println(D);  
		System.out.println(d);
aurelio_silva
mario.fts:
aurelio_silva:
Olha, o método que estou trabalhando só recebe Double, pelo que estou vendo não há alguma forma de somar sem fazer a gamb de 10*10...
Double D = 10.2;      
double d = 0.0;  
         
d += (10.2*10)*10;  
               
System.out.println(D);  
System.out.println(d);

Se alguém tiver mais alguma idéia, valeu.

Double D = 10.2;      
		double d = 0.0; 
		
		BigDecimal numero = new BigDecimal(Double.toString(D));
		
		         
		d += numero.multiply(new BigDecimal("100")).doubleValue();  
		               
		System.out.println(D);  
		System.out.println(d);

Matou o problema, Obrigado.

victorwss

float is evil
double is evil

Criado 27 de abril de 2009
Ultima resposta 27 de abr. de 2009
Respostas 11
Participantes 5