Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Box

Resultado inexato de uma subtração???

Mensagens Recomendadas

Box

Prezados amigos,

Sou principiante nisso e gostava de pedir se alguém sabe porque não consigo um resultado exacto com o código abaixo:

package testecontas_002;
public class TesteContas_002 {
    public static void main(String[] args) {
       
        double n1 = 1067.58;
        double n2 = 0;

        double total_01 = n1 + n2;
 
        double n3 = 180;
        double n4 = 0;
        double n5 = 0;
        double n6 = 0;
        double n7 = 0;
        
        double total_02 = n3 + n4 + n5 + n6 + n7;
        
        double total_03 = total_01 - total_02;
        
        System.out.println(total_01);
        System.out.println(total_02);
        System.out.println(total_03);

    }
}

Resultado:

run:
1067.58
180.0
887.5799999999999
BUILD SUCCESSFUL (total time: 0 seconds)

887.5799999999999 ??? como pode ser?

Não devia ser 887.58 exatamente?

Agradecia alguma ajuda para descobrir onde errei o código.

Obrigado desde já.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Box
Em 07/12/2018 às 08:49, HappyHippyHippo disse:

se deveria ser o valor exacto de 887.58 ? não

porquê ? ... isso é uma história bem comprida ...

o que te posso dizer, e para não me estender muito é leres sobre o assunto : https://en.wikipedia.org/wiki/Floating-point_arithmetic

Obrigado pelo link para este artigo, ele responde de facto á minha pergunta, mas gostava de além disso ter uma dica de como posso alterar o meu código para que o resultado seja exacto, é que esta pequena aplicação serve para fazer a reconciliação de contas e a possibilidade de gerar um erro de mais ou menos um cêntimo pode ser um problema.

Obrigado :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Podes usar a classe BigDecimal para teres resultados exactos.  Se só precisas de representar centimos (duas casas decimais), outra hipótese é usares int/long que guardam valores em centimos (e ao mostrares os valores fazes a conversão de unidade).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.