Floats  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
thiagofesta
JavaGuru
[Avatar]

Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline

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.

This message was edited 1 time. Last update was at 27/05/2010 15:59:19


"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln
[WWW] [Yahoo!] [MSN]
juliofsn
JavaEvangelist
[Avatar]

Membro desde: 21/11/2006 20:48:46
Mensagens: 311
Offline

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

Que a Força esteja com Você!
thiagofesta
JavaGuru
[Avatar]

Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline

juliofsn wrote: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)

"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln
[WWW] [Yahoo!] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

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

This message was edited 1 time. Last update was at 27/05/2010 16:11:37


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline

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.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
thiagofesta
JavaGuru
[Avatar]

Membro desde: 19/12/2007 10:42:11
Mensagens: 233
Offline

ViniGodoy wrote: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.


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.

"É melhor calar-se e deixar que as pessoas pensem que você é tolo, do que falar e acabar com a dúvida"
Abraham Lincoln
[WWW] [Yahoo!] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

thiagofesta wrote:
juliofsn wrote: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




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 )

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team