| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2007 20:29:40
|
Maykol Nack
Smalltalk
Membro desde: 29/08/2007 20:26:47
Mensagens: 4
Offline
|
Na tentativa de multiplicar dois doubles e imprimir no console estou com um erro meio loco, como sou iniciante, espero que alguem possa me dizer alguma maneira de solucionar.
Eu multiplico 7.9 * 3.0 e o resultado sai 23.700000000000003, e o certo deveria ser 23.7
Alguem pode me explicar o por que disso, eu sei que eu posso arredondar as casas e ja vai ser solucionado, mais pq o Java faz isso, ou eu nao posso usar dois doubles para multiplicar .
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2007 20:52:48
|
Marky.Vasconcelos
Moderador
![[Avatar]](/images/avatar/04940fadf3702cbd84b7a48161037c4f.png)
Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline
|
Você pode multiplicar Doubles, é assim como o float o double é um numero arredondado o maximo possivel, não lembro porque ele faz isso no fórum já vi a explicação.
só sei que como float pode ter resultados mais estranhos
|
Facebook @MarkyHitchhiker +Mark WP: MarkyTech's
Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais
DefaultTableModel?! PARE! Não faça isso! Faça melhor!
Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)
Develop games is fantastic, with words you can make worlds!!!
DON'T PANIC!
MarkyHitchhiker's Blog! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2007 21:39:45
|
GiancarloBraga
Java Ninja
![[Avatar]](/images/avatar/60a77e068efeffff1391d72e4fbfec5c.jpg)
Membro desde: 25/06/2007 06:00:00
Mensagens: 261
Offline
|
Se você precisar que o resultado final fique mais conciso eu recomendo o uso de um printf.
O 2 é o número de casas decimais. Use de acordo com a necessidade.
Abraço
|
-------------------------
Visitem meu novo Java Blog para iniciantes:
http://giancarlobraga.joolo.com/
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2007 21:57:20
|
Maykol Nack
Smalltalk
Membro desde: 29/08/2007 20:26:47
Mensagens: 4
Offline
|
o printf imprime ele no console.
mais se eu querer armazenar ele no banco de dados, como faço para que o double fique com o valor certo ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2007 22:32:15
|
GiancarloBraga
Java Ninja
![[Avatar]](/images/avatar/60a77e068efeffff1391d72e4fbfec5c.jpg)
Membro desde: 25/06/2007 06:00:00
Mensagens: 261
Offline
|
Aí você vai precisar usar se não me engano algo como DecimalFormat do pacote java.text.
O pessoal usa ainda umas outras que eu desconheço(meio iniciante). Mas creio que essa DecimalFormat atende às suas necessidades, sem certeza, ok?
http://www.javadoconline.com/search.jsp?from=main&class=DecimalFormat&action=pesquisa
|
-------------------------
Visitem meu novo Java Blog para iniciantes:
http://giancarlobraga.joolo.com/
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/08/2007 23:16:39
|
Maykol Nack
Smalltalk
Membro desde: 29/08/2007 20:26:47
Mensagens: 4
Offline
|
Entendo sim, ja até tinha visto o DecimalFormat tambem, só que bah né, é dose toda multiplicacao ter que fazer isso
pensei que tinha algo mais pratico
mesmo assim vlw
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/08/2007 10:04:42
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
O porque disso é o seguinte.
O computador não trabalha bem com casas decimais. Como você sabe, os dados são representados internamente no formato binário.
O número 4, por exemplo, é representado pelo computador assim:
100 (onde 1x2^2 + 0x2^1 + 0x2^0 = 4)
Como é representado um número menor que zero? Cada casa após a vírgula representa os valores 1/2 (2^-1), 1/4 (2^-2), 1/8 (2^-3) e assim sucessivamente.
Então, os números 4,25 0,5 e 4,75 ficam assim em binário:
100,01 100,10 100,11
Que problema que você tem aí? O computador é muito pobre em representações de casas decimais. Tente representar 0,3.
Isso é 0,25 + 0,03125 + 0,009765635...
Para contornar o problema, o que se faz é o seguinte. Faz-se os cálculos com um número grande de casas decimais. E depois arredonda-se o resultado. Por isso diz que que contas em float e double são imprecisas. Os tipos primitivos estão sujeitos a precisão do processador. Alguns processadores chegam a 50 bits, o que já é suficiente para a maior parte das aplicações.
Entretanto, muitas vezes não é suficiente. O java fornece classes para que você manipule números de precisão arbitrária. Nesse caso, os calculos são feitos por software, e são muito mais lentos. Mas ainda sim, quebram um galhão.
Isso explica o porque da sua multiplicação ter retornado aquele 3 estranho lá no final do número.
|
@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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/08/2007 10:19:47
|
Maykol Nack
Smalltalk
Membro desde: 29/08/2007 20:26:47
Mensagens: 4
Offline
|
O java fornece classes para que você manipule números de precisão arbitrária
Quais seriam essas classes?
Tentei usar o DecimalFormat e o problema ainda persiste, ele nao ta arredondando.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/08/2007 18:31:00
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline
|
São as classes BigDecimal e BigInteger.
|
@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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/08/2007 21:24:28
|
Marky.Vasconcelos
Moderador
![[Avatar]](/images/avatar/04940fadf3702cbd84b7a48161037c4f.png)
Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline
|
sobre o Format é só usar assim
|
Facebook @MarkyHitchhiker +Mark WP: MarkyTech's
Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais
DefaultTableModel?! PARE! Não faça isso! Faça melhor!
Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)
Develop games is fantastic, with words you can make worlds!!!
DON'T PANIC!
MarkyHitchhiker's Blog! |
|
|
 |
|
|