Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 2906 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Olá a todos, uso o Delphi 2010 e reparei um pequeno problema em minha aplicação. Observem o código abaixo como exemplo:

procedure Tfrm_nfce_pdv_fechamento.btn_finalizarnClick(Sender: TObject);
var
credito: Double
begin
    credito := 32.3;
    ShowMessage(FloatToStr(credito - 32.3));
end;

Ao invés de exibir o valor ZERO, recebo um valor absurdo, -2,84147705365001E-15.

Mas se eu declarar a variável "credito" como sendo Currency, o resultado aparece ZERO, como deveria ser.

Porque esse comportamento com a variável do tipo Double?

Desde já agradeço a atenção de todos

 

imagem.JPG

  • Consultores
Postado

-2,84147705365001E-15 é mais ou menos igual a -0,000000000000002841477053650.

Essa é a diferença entre os dois números que você calculou. Isso acontece devido a forma de armazenamento.

O artigo que o Daniel citou explica um pouco sobre isso.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Membros Pro
Postado (editado)
56 minutos atrás, EMBarbosa disse:

-2,84147705365001E-15 é mais ou menos igual a -0,000000000000002841477053650.

Essa é a diferença entre os dois números que você calculou. Isso acontece devido a forma de armazenamento.

O artigo que o Daniel citou explica um pouco sobre isso.

Olá EMBarbosa, estava lendo o artigo, bem completo e um tanto complexo :-)

Pelo que pude entender, essa variável Double por motivos internos do Delphi acabou recebendo o valor de 32,29999999999999715852294635, mais ou menos. Como forma de contornar isso, entendi que devem ser aplicados arredondamentos, entendi corretamente?

Desde já agradeço a atenção de todos

Editado por doidopb
  • Membros Pro
Postado
1 minuto atrás, Daniel Simoes disse:

Isso mesmo.. use os métodos de Round, ou ainda algo como:


  CompareValue(Val1, Val2, 0.001);

 

Daniel, pelo que acompanhei no artigo todos os tipos do Delphi para armazenamento de números decimais tem essa peculiaridade, Double, Currency, etc.

É isso mesmo ou teria algum tipo específico ou mais aconselhável para ser usado nesse caso e me livrar de ter que arredondar?

  • Consultores
Postado
1 hora atrás, doidopb disse:

Pelo que pude entender, essa variável Double por motivos internos do Delphi acabou recebendo o valor de 32,29999999999999715852294635, mais ou menos.

Isso não é do Delphi especificamente. Toda linguagem de programação é assim armazenando apenas uma aproximação do número decimal (conhecido como ponto flutuante ou float).

Pense no seguinte: Quantos números reais existem entre 0 e 1?

Infinitos.

E entre 0,1 e 0,2?

Infinitos.

E entre 0,0000001 e 0,0000002?

Infinitos.

Mas a memória do seu computador é finita. Pior, a memória alocada para uma variável numérica é finita. Então é impossível expressar todos os números entre 0,1 e 0,2 com a memória alocada para um tipo. Quanto menos expressar todos os números reais...

Um artigo com explicação mais detalhada é o "What Every Computer Scientist Should Know About Floating-Point Arithmetic" por David Goldberg.

Já citei este artigo em outro tópico, juntamente com um link para uma pergunta relacionada no StackOverflow:

Em 17/03/2012 at 10:07, EMBarbosa disse:

Pra quem quiser estudar mais a fundo, link para o artigo What Every Computer Scientist Should Know About Floating-Point Arithmetic (O que todo cientista da computação deveria saber sobre aritmética de ponto flutuante). E pergunta a "Como comparar double no Delphi?" no StackOverflow (também em inglês) http://stackoverflow.com/questions/6106119/how-to-compare-double-in-delphi

  • Curtir 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • Este tópico foi criado há 2906 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.