Problemas FLOAT & Double

5 respostas
V

Como lidar com esse problema sem que a solucao seja formatar a saida.

class teste{
 public static void main(String arg[]){
  double a = .0;
  float b = .0f;

  for(int i=0 ; i++ < 25; ){
   System.out.println((a += 0.1)+ " - "+ (b += 0.1));
  }
 }
}

Resultado

0.1 - 0.1
0.2 - 0.2
0.30000000000000004 - 0.3
0.4 - 0.4
0.5 - 0.5
0.6 - 0.6
0.7 - 0.70000005
0.7999999999999999 - 0.8000001
0.8999999999999999 - 0.9000001
0.9999999999999999 - 1.0000001
1.0999999999999999 - 1.1000001
1.2 - 1.2000002
1.3 - 1.3000002
1.4000000000000001 - 1.4000002
1.5000000000000002 - 1.5000002
1.6000000000000003 - 1.6000003
1.7000000000000004 - 1.7000003
1.8000000000000005 - 1.8000003
1.9000000000000006 - 1.9000003
2.0000000000000004 - 2.0000002
2.1000000000000005 - 2.1000001
2.2000000000000006 - 2.2
2.3000000000000007 - 2.3
2.400000000000001 - 2.3999999
2.500000000000001 - 2.4999998

Como resolver este problema???

Obrigado

5 Respostas

bzy

Mas que tipo de formatação vc quer?
Compila ai e veja um bom exemplo.
(tirado de: http://java.sun.com/docs/books/tutorial/uiswing/components/ )

georgesq

procura sobre NumberFormat

V

O problema neste caso, nao seria bem Qual tipo de formacao eu gostaria.
Mas sim o caso de que :
Se minha variavel float A = 0.1
Entao A = A + 0.1.
o resultado logico seia A = 0.2

Porem… nao he bem isso que ocorre em alguns casos… Como vcs podem ver no exemplo que eu passei acima.

Gostaria de saber se existe alguma forma de tratar isso, ou talvez se este seria um bug, ou qualquer outra coisa.

T

Não há como, se for usar apenas float e double. É que 0.1 não é representado em forma exata em binário.
No seu caso você pode usar BigDecimal, se não quiser efetuar a formatação.
Uma explicação mais longa está em:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

Note que os exemplos desse artigo estão em Fortran e C, indicando que esse problema é inerente à notação de ponto-flutuante (float & double), e não é, de forma alguma, um bug do Java.

V

Valew Aew…

Criado 14 de fevereiro de 2007
Ultima resposta 15 de fev. de 2007
Respostas 5
Participantes 4