GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Multiplicar Doubles


#1

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 .


#2

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


#3

Se você precisar que o resultado final fique mais conciso eu recomendo o uso de um printf.

double valor = 7.9 * 3.0;
System.out.printf("O resultado é: %.2f.", valor );

O 2 é o número de casas decimais. Use de acordo com a necessidade.

Abraço


#4

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 ?


#5

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


#6

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


#7

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.


#8

Quais seriam essas classes?

Tentei usar o DecimalFormat e o problema ainda persiste, ele nao ta arredondando.


#9

São as classes BigDecimal e BigInteger.


#10

sobre o Format é só usar assim

Format df = new DecimalFormat("#######,00");
double a = 25,399999999999;
System.out.println(df.format(a));

#11