Multiplicar Doubles  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
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 .


Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 6595
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

Github Facebook +Mark @MarkyHitchhiker 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!
[WWW] [MSN]
GiancarloBraga
Java Ninja
[Avatar]

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/




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 ?
GiancarloBraga
Java Ninja
[Avatar]

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/




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
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 25124
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

Novo no fórum? Leia nosso How to.

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

ViniGodoy
Moderador
[Avatar]

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

São as classes BigDecimal e BigInteger.

@ViniGodoy - Lattes

Novo no fórum? Leia nosso How to.

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]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 6595
Localização: São Paulo/SP
Offline

sobre o Format é só usar assim

Github Facebook +Mark @MarkyHitchhiker 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!
[WWW] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team