Problemas com multiplicação de tipo inteiro com tipo double

19 respostas
A

Bom dia galera, tenho uma tela aqui que contem 3 textfield, um para quantidade, o outro para preço, e o outro para total que recebe a quantidade x o preço, e um botão chamado calcular, mas to com um problema aqui, caso eu digite 6 ou 7 para quantidade e um preço de 10.95, quando clico no botão calcular o valor total aparece como 99999999, será por que???
vou postar o código que faz o calculo.

int quantidade = Integer.parseInt(tf_quantidade.getText());
double preco = Double.parseDouble(tf_preco.getText());
double total = (quantidade * preco);

19 Respostas

F

Anderson S.:
Bom dia galera, tenho uma tela aqui que contem 3 textfield, um para quantidade, o outro para preço, e o outro para total que recebe a quantidade x o preço, e um botão chamado calcular, mas to com um problema aqui, caso eu digite 6 ou 7 para quantidade e um preço de 10.95, quando clico no botão calcular o valor total aparece como 99999999, será por que???
vou postar o código que faz o calculo.

int quantidade = Integer.parseInt(tf_quantidade.getText());
double preco = Double.parseDouble(tf_preco.getText());
double total = (quantidade * preco);

isso era para dá certo sim, tenta assim:

int quantidade = Integer.parseInt(tf_quantidade.getText());
double preco = Double.parseDouble(tf_preco.getText());
double total = ( quantidade * 1.0 * preco);
tf_total.setText(total+"");
ViniGodoy

Já tentou usar o depurador?

E como vc está imprimindo esse valor?

E

Pelo tipo de erro, dá a impressão que ele está usando:

tf_total.setText ("99999999");

Eu esperaria que aparecesse algo como “65.699999998” ou “65.[telefone removido]” ou coisa parecida. Mas isso parece ser resto de um código de teste que foi posto lá só para ver se estava funcionando :slight_smile:

ViniGodoy

O que pode estar é imprimindo isso, mas o TextField ser pequeno, alinhado a direita e o resto do número estar escondido.

A

Ai galera eu errei na descrição do enunciado, ta imprindo não é 999999, e sim 76.649999999, caso eu entre com uma quantidade de 7, então o problema é como arredondar esse valor para —>>> 76.65 <<<—, isso que tenho que resolver… como eu faço???
Ai galera, foi mal por ter errado no enunciado…

Obrigado!

F

recomendo você usar a perpectiva de debug para verificar o que acontece no seu código.

ou então posta o código para podermos verificar.

E

Anderson S.:
Ai galera eu errei na descrição do enunciado, ta imprindo não é 999999, e sim 76.649999999, caso eu entre com uma quantidade de 7, então o problema é como arredondar esse valor para —>>> 76.65 <<<—, isso que tenho que resolver… como eu faço???
Ai galera, foi mal por ter errado no enunciado…

Obrigado!

Se quiser que apareçam 7 casas depois da vírgula, no máximo, faça algo como:

double valor = .....;
DecimalFormat df = new SimpleDecimalFormat ("#0.#######"); // veja que pus 7 "#" depois do "."
tf_total.setText (df.format (valor)); // deve imprimir "76.65" como esperado.
pczardini

Tenta fazer um casting de INT sobre a chamada… talvez funcione!

ViniGodoy

Isso ocorre por causa disso aqui: http://www.guj.com.br/posts/list/84121.java#448928

Uma das soluções mais recomendadas aqui é utilizar a classe BigDecimal. Veja o artigo:
http://blog.caelum.com.br/2010/07/15/arredondamento-no-java-do-double-ao-bigdecimal/

F

Anderson S.:
Ai galera eu errei na descrição do enunciado, ta imprindo não é 999999, e sim 76.649999999, caso eu entre com uma quantidade de 7, então o problema é como arredondar esse valor para —>>> 76.65 <<<—, isso que tenho que resolver… como eu faço???
Ai galera, foi mal por ter errado no enunciado…

Obrigado!

você pode arredondar usando DecimalFormat, assim:

double valor = 76.649999999; new DecimalFormat("00,00").format(valor)

A

vou testar;;

ViniGodoy

Sim. Mas não deixe de ler os artigos que indiquei. É importante compreender bem o problema.
E o double para valores monetários podem gerar imprecisões ainda maiores, na casa dos centavos.

E

Sim senhor, é que não fiquei olhando seu programa com muita atenção. Pus um nome qualquer (pelo menos não usei “x” :slight_smile: ) e confiei em você.

A

Ai galera, ta convertendo agora, mas ta com um problema, to textfield ta aparcendo 76,65, e ta dando erro por causa da virgula… como faz para não aparecer a vírgula?? e sim um ponto “.”

E
double valor = .....;  
DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance (Locale.US));
DecimalFormat df = new DecimalFormat ("#0.#######", dfs);
tf_total.setText (df.format (valor)); // deve imprimir "76.65" como esperado.
F

double valor = 76.649999999; new DecimalFormat("00.00").format(valor)

A

ViniGodoy:
Isso ocorre por causa disso aqui: http://www.guj.com.br/posts/list/84121.java#448928

Uma das soluções mais recomendadas aqui é utilizar a classe BigDecimal. Veja o artigo:
http://blog.caelum.com.br/2010/07/15/arredondamento-no-java-do-double-ao-bigdecimal/


Nesse artigo tem um exemplo de dividir, utilizando bigDecimal, como faz para miltiplicar utilizando ele??

A

Ai entanglement deu certinho cara, ta aparecendo com o ponto"." agora, valeu mesmo…
Obrigado a todos, qualquer coisa aviso…

E

Anderson S.:
ViniGodoy:
Isso ocorre por causa disso aqui: http://www.guj.com.br/posts/list/84121.java#448928

Uma das soluções mais recomendadas aqui é utilizar a classe BigDecimal. Veja o artigo:
http://blog.caelum.com.br/2010/07/15/arredondamento-no-java-do-double-ao-bigdecimal/


Nesse artigo tem um exemplo de dividir, utilizando bigDecimal, como faz para miltiplicar utilizando ele??

Cara, multiplicar é bem mais fácil que dividir. O exemplo dado, de divisão, é porque ela é a operação que é de longe a mais complicada de todas; as outras, se você olhar o Javadoc, são muito simples.

http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#multiply(java.math.BigDecimal)

Criado 26 de outubro de 2010
Ultima resposta 26 de out. de 2010
Respostas 19
Participantes 5