| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 19:07:17
|
grustk
JavaBaby
Membro desde: 06/04/2006 14:32:39
Mensagens: 92
Localização: Sampa
Offline
|
tenho um numero 10.80F.
multiplico ele por 100 e converto pra int usando o wrapper. mas ele me mostra 1079. Por quê?
|
Não quero saber se o pato é macho ... EU QUERO O OVO !!!! |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 19:22:45
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Como é que você fez? Não consegui repetir o seu problema.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 19:26:29
|
grustk
JavaBaby
Membro desde: 06/04/2006 14:32:39
Mensagens: 92
Localização: Sampa
Offline
|
eh um metodo estatico de uma classe auxiliar ... o codigo do metodo eh ...
isso vai direto na pagina com scriptlets.
|
Não quero saber se o pato é macho ... EU QUERO O OVO !!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 19:34:08
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Ainda não consegui reproduzir seu problema.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 19:46:05
|
grustk
JavaBaby
Membro desde: 06/04/2006 14:32:39
Mensagens: 92
Localização: Sampa
Offline
|
eu tentei reproduzir .. com um main .. mas tbm naum deu certo ... mas na pagina eh isso q acontece ...
esse eh o source ...
esse eh o out ...
|
Não quero saber se o pato é macho ... EU QUERO O OVO !!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 20:14:29
|
grustk
JavaBaby
Membro desde: 06/04/2006 14:32:39
Mensagens: 92
Localização: Sampa
Offline
|
Substituí ...
por ...
e funcionou !
Pode me explicar a diferença ?
|
Não quero saber se o pato é macho ... EU QUERO O OVO !!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 20:18:51
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
1) Se possível, nunca use float para fazer contas. Use sempre double. Por incrível que pareça, double chega até a ser um pouco mais rápido.
2) oCart.getTotal() não deve estar voltando o valor 10.79f, e sim um resultado de uma soma, que deve ser algo como 10.78998 ou coisa parecida.
Mais um motivo para usar double em vez de float - a precisão de um float é de cerca de 6 algarismos significativos, que é muito pouco para lidar com dinheiro.
Use double, que tem cerca de 15 algarismos significativos de precisão.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 20:25:44
|
jcatino
Thread.start()
![[Avatar]](/images/avatar/00482b9bed15a272730fcb590ffebddd.jpg)
Membro desde: 18/08/2005 17:41:10
Mensagens: 45
Localização: São Paulo
Offline
|
grustk wrote:Substituí ...
por ...
e funcionou !
Pode me explicar a diferença ?
Você arredondou o resultado da multiplicação de um float, que está trazendo uma precisão muito maior à desejada, e quando convertida para Integer o resultado final distorce o que vc esta esperando como resposta.
Pense que um float é um ponto flutuante. Portanto , é armazenado em duas partes, sendo uma a mantissa e outra o expoente, para compor um número em notação científica.
Com isso um float / double podem armazenar valores com decimais muito precisos como 54,18828734.
Mas o lado ruim é que vc está querendo ter como resposta 10,98 e ele gravou algo como 10,9777777777799998, para conversar a precisão desejada.
A verdade é que se vc está querendo representar valores de moedas (na programação também chamados de 'amount' ou 'montantes'), o melhor é gravar num Integer mesmo e dividir por 100 para não ter esses problemas de arredondamento. Outra solução trabalhosa mas elegante é trabalhar com BigDecimal, sempre indicando a precisão (scale) nas operações desejadas como adição, substração, etc...
Resumo da estória: float e double não servem para manipular valores de moedas, e diria até que é perigoso fazê-lo, combinando ainda resultados em inteiros, pois os arredondamentos necessários vão gerar distorções. Float e Double servem para armazenar valores com várias casas decimais, ou para valores muito altos (acima de bilhões) com precisão de decimais.
|
--
J Catino
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 20:27:44
|
jcatino
Thread.start()
![[Avatar]](/images/avatar/00482b9bed15a272730fcb590ffebddd.jpg)
Membro desde: 18/08/2005 17:41:10
Mensagens: 45
Localização: São Paulo
Offline
|
thingol wrote:1) Se possível, nunca use float para fazer contas. Use sempre double. Por incrível que pareça, double chega até a ser um pouco mais rápido.
2) oCart.getTotal() não deve estar voltando o valor 10.79f, e sim um resultado de uma soma, que deve ser algo como 10.78998 ou coisa parecida.
Mais um motivo para usar double em vez de float - a precisão de um float é de cerca de 6 algarismos significativos, que é muito pouco para lidar com dinheiro.
Use double, que tem cerca de 15 algarismos significativos de precisão.
Embora com double o problema apareça menos, ele também existe, e se acumular / arredondar valores, sempre vão aparecer distorções. Mas concordo que no caso específico, double também vai funcionar.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 20:46:24
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Usar "double" para lidar com moeda é possível mas você tem de tomar muito cuidado.
(Ou seja, seu programa funciona bem com você, que sabe fazer contas, mas aí vai ser mantido por alguém que não conhece aritmética de ponto flutuante e não entende porque 3.0 * (1.0 / 3.0) != 1.0, e acaba dando pau !
Normalmente você é obrigado a usar double só quando você tem de calcular juros compostos ou alguma outra coisa que não permite usar o feijão-com-arroz de calcular as coisas em centavos e usar um "long".
Em VB 6.0 existe um tipo "Currency" que é na verdade um "long" (64 bits) que calcula as coisas em centésimos de centavos, e é convertido automaticamente de e para Double. Seria interessante se existisse algum assim em Java.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 26/12/2006 22:10:04
|
lordi
JavaBaby
![[Avatar]](/images/avatar/414187419105b06734cd36adead79115.png)
Membro desde: 21/11/2006 18:57:10
Mensagens: 76
Offline
|
a indicação para uso monetario eh a classe BigDecimal n eh?
|
Renato E. Silva
Raciocinar é uma arte e não uma ciência - Wos, Raciocínio Automático, 1984
A Primeira Lei da Profecia:
Quando um cientista famoso, mas de idade avançada, afirma que algo é possível, ele está quase indubtavelmente certo. Quando ele afirma que algo é impossível, ele muito provavelmente está errado.
A Segunda Lei:
A única maneira de descobrir os limites do possível é se aventurar um pouco no impossível.
A Terceira Lei:
Qualquer tecnologia suficientemente avançada é indistinguível da mágica. - Arthur C. Clarke |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/12/2006 12:12:33
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
BigDecimal é um pouco chato de usar.
Eu só aconselharia seu uso se:
- Você só precisa fazer somas, subtrações, multiplicações e divisões;
- Sabe que você tem de arredondar o resultado da divisão ou da multiplicação para ter as 2 casas depois da vírgula (no caso de valores monetários, em centavos), ou passar os parâmetros adequados para que as rotinas já façam esse arredondamento;
- Tiver paciência para converter as suas fórmulas
- Ficar convertendo e desconvertendo de/para double se tiver alguma fórmula mais complicada (exemplo: cálculo de juros compostos).
|
|
|
 |
|
|