JAVA - Cálculo retornando número com decimais sendo que o resultado é inteiro

4 respostas
java
A

Antes não tinha este problema, mas não sei porque, de um tempo pra cá o meu programa financeiro em java começou a trazer o resultado com casas decimais mesmo que o resultado seja inteiro. Exemplo:

Em qualquer calculadora: 12,6 + 0,7 = 13,3

No JAVA: 12,6 + 0,7 = 13,29999999999999

Porém isso só acontece com alguns cálculos, outros ele retorna inteiro normal.

Alguém sabe porque?

Estou fazendo esses cálculos usando variáveis double ou float, em ambos dá esse problema.

4 Respostas

R
Seu primeiro problema é a pesquisa!

<aside class="quote" data-post="1" data-topic="130214">
  <div class="title">
    <div class="quote-controls"></div>
    <img alt="" width="20" height="20" src="/letter_avatar_proxy/v2/letter/i/59ef9b/40.png" class="avatar">
    <a href="//www.guj.com.br/t/precisao-em-java-de-double/130214?source_topic_id=378571">Precisão em Java de Double</a> <a class="badge-wrapper  bullet" href="/c/programacao/java">Java</a>
  </div>
  <blockquote>
    Estou com o seguinte problema: 

double a = 100.0; double b = 100.0; double c = 300.33; 

double d = a+b+c; 

sysout(d); 

retorno = 533.329999999... 

bem, visto que é apenas uma soma, sem divisão, não PODE acontecer... 

Testei em 3 ambientes diferentes (SO e JRE) 

gostaria de saber se alguém poderia me dizer como "passar por cima" disso, sem muita gambiarra... 

Agradeço.
  </blockquote>
</aside>


<aside class="onebox whitelistedgeneric">
  <header class="source">
      <img src="https://www.devmedia.com.br/favicon.png" class="site-icon" width="16" height="16">
      <a href="https://www.devmedia.com.br/java-bigdecimal-trabalhando-com-mais-precisao/30286" target="_blank">DevMedia</a>
  </header>
  <article class="onebox-body">
    <div class="aspect-image" style="--aspect-ratio:129/67;"><img src="https://arquivo.devmedia.com.br/midiasocial/artigo-devmedia-facebook.jpg" class="thumbnail"></div>

<h3><a href="https://www.devmedia.com.br/java-bigdecimal-trabalhando-com-mais-precisao/30286" target="_blank">Java BigDecimal: Trabalhando com mais precisão</a></h3>

Veja neste artigo porque você deve utilizar a classe BigDecimal ao invés do double para trabalhar com uma maior precisão em valores monetários em Java.

A

Obrigado, já resolveu meu problema. Eu pesquisei sim amigo, não estava colocando as palavras corretas.

R

Contribua, poste a solução

A

Eu tinha uma função que criei para um outro caso, para truncar ou arredondar valores. Ai acabei usando ela para estes casos também. Quando passo T, eu trunco, quando passo outro valor, arredondo. Segue a função:

private static BigDecimal ajustaDecimal(double x,int numberofDecimals, String tipo)
{

//T trunca, se não, arredonda pro mais próximo.

if ( x > 0) {

if (T.equals(tipo))

return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);

else

return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_HALF_EVEN);

} else {

if (T.equals(tipo))

return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);

else

return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_HALF_EVEN);

}

}
Criado 21 de novembro de 2018
Ultima resposta 21 de nov. de 2018
Respostas 4
Participantes 2
Alura POO: o que é programação orientada a objetos? Aprenda os conceitos básicos da programação orientada a objetos, como classes, objetos, herança, encapsulamento e polimorfismo, com exemplos.
Casa do Codigo Desbravando SOLID: Praticas avancadas para codigos de... Por Alexandre Aquiles — Casa do Codigo