Floats

6 respostas
thiagofesta

Boa tarde,

Tenho uma parte de um código aqui que pega a posição do mouse e faz uma divisão, mas esse valor da tipo:
56 / 81 = 0,66666666666666666666666666666667

No programa faço:
float f = (float) ((float) x / (float) y);

mas o maldito do f vem com 0,66666666 (apenas 8 casas decimais!)
o X e Y vem de um int do getX() e getY() de mouseevent

Obs: preciso ser preciso, pois efetuop calculos geometricos, e devido a esse “truncamento”, da erro.

6 Respostas

juliofsn

Use double para aumentar a precisão.
Se você quer precisão máxima, então use BigDecimal

thiagofesta

juliofsn:
Use double para aumentar a precisão.
Se você quer precisão máxima, então use BigDecimal

Com double ele de fato aumenta a precisão, mas não aparece o maldito do 7 la do fim.

Está estranho isso!
Vou tentar com BigDecimal

Segundo o ViniGodoy é pra usar float em calculos científicos que precisam ser precisos (meu caso)

ViniGodoy

É mesmo, quando ele falou isso?

Na verdade, eu já fiz algumas postagens explicando porque floats e doubles são imprecisos:
http://www.guj.com.br/posts/list/84121.java#448928
http://www.guj.com.br/posts/list/68086.java#357907

Troque sua variável para double. Embora para gráficos, geralmente floats são suficientemente precisos.

O BigDecimal, se você estiver fazendo um jogo ou vídeo é muito lento.

ViniGodoy

Aliás, como uma imprecisão na 29º casa decimal está gerando algo perceptível em seu desenho? Acho mais provável ter algum tipo de erro do seu cálculo.

thiagofesta

Estou achando o ponto médio de uma reta. e depois uso para efetuar calculos com a equação fundamental da reta para ver se um ponto está na reta. E ele está aredondando, e não sei o motivo, vou ver os links que você mandou.

sergiotaborda

thiagofesta:
juliofsn:
Use double para aumentar a precisão.
Se você quer precisão máxima, então use BigDecimal

Com double ele de fato aumenta a precisão, mas não aparece o maldito do 7 la do fim.

Está estranho isso!

Isso não é nada estranho. Vc que não sabe trabalhar com numeros.

Primeiro 56/81 é 0,(691358024)

É uma dizima periodica de periodo 691358024.

Mas mesmo que fosse o numero que diz,o numero seria 0,(6) dizima periodica de periodo 6

voc não pode esperar dividir e depois multipliar e dar o mesmo. Nem com bigdecimal isso funciona.
O algoritmo tem que parar em algum ponto , se a dizima é infinita isso causa um arredondamento na ultima casa…

O que vc precisa é o usar o padrão Ratio, para apenas fazer o calculo real no final

com float, double, bigdecimal vc faz

a = (1/3);
b = a * 3;

// b não é 1, mas deveria ser.

por outro lado, precisão é sempre relativa. não existe nada abssoluto. qual é a sua margem de erro ? (não sabe qual é? então seus calculos nunca serão precisos )

Criado 27 de maio de 2010
Ultima resposta 27 de mai. de 2010
Respostas 6
Participantes 4