[firebase-br] Erro na recuperação do valor
Társis Francke Ferreira
tarsis em mithrandir.com.br
Sex Nov 14 11:14:09 -03 2008
Obrigado Eduardo. Já vi que vou ter de trocar o tipo de dados mesmo.
Abraço!
----- Original Message -----
From: "Eduardo Bahiense" <eduardo em icontroller.com.br>
To: <lista em firebase.com.br>
Sent: Friday, November 14, 2008 10:55 AM
Subject: Re: [firebase-br] Erro na recuperação do valor
Olá
Não acessei os links que o Cantu postou, mas para valores de ponto
flutuante a conversa é com o processador. Considere um valor de ponto
flutuante como a melhor hipótese de se alcançar o valor que você pediu.
Valores flutuantes, como o nome já diz, não são absolutos. Por exemplo,
você disse X := 9798,2, porém, o processador não considera isso como um
valor absoluto e determina, dentro de sua capacidade de cálculo, qual o
valor mais aproximado que ele consegue, resultando algo como
9798,15234573892 - (2 + 2 em ponto flutuante, via de regra, não é 4).
Por incrível que pareça, valores em ponto flutuante são utilizados para
cálculos de alta precisão, pois conseguem aproximar em até 15 casas
decimais (salvo engano meu).
O problema disso é, pasmem, que cada processador tem sua regra, assim,
em uma mesma rede onde residam um PIV em um Celeron, por exemplo, cada
um pode dar um número diferente para 9898,2.
Observe que mesmo que o campo seja NUMERIC(N,X), se sua variável no
DEPLHI for single ou double, ou mesmo se você atribuir Campo.AsFloat :=
9798,2, estará sujeito a esse problema. Claro que, no caso do campo ser
NUMERIC, quando o FB converter, normalmente, resultará 9798,2, porém, se
no FB o campo for FLOAT, teremos duas interpretação do valor, uma na
máquina cliente e outra na máquina servidora, pois são processadores
distintos solicitados a retornar um valor de ponto flutuante.
Assim, o tipo float torna-se inviável para o tratamento de valores
financeiros, por exemplo, ou de valores resultantes de cálculos extensos
(soma de muitos itens, por exemplo), cujo resultado será expresso com 1
ou duas casas decimais. Nessas situação, é inevitável a dierença de 1
centavo para mais ou para menos, comparado ao valor obtido pela
calculadora de mesa. Seu uso, como já disse anteriormente, é recomendado
para sistemas de cálculos matemáticos de alta precisão, como cálculos de
engenharia.
Como eu descobri tudo isso? Porque apanhei mais que malha velha para
soltar poeira com esses tais 1 centavo e só resolvi quando modifiquei o
Sistema para usar Currency internamente e o banco de dados para usar
NUMERIC(X,N). O que descrevi acima, consegui na lista oficial da
Borland, há alguns anos, mas não tenho mais o documento original para te
referenciar.
Observe que,mesmo em ACCESS, ou qualquer outro SGBD, ou mesmo em
PARADOX, o descrito acima é verdadeiro.
Abraço
Eduardo
Társis Francke Ferreira escreveu:
> Já debuguei e o valor sendo passado é 9798,2 e ele grava com outras
> casas decimais.
> Não tem um jeito de gravar exatamente com o valor que eu passo?
> ----- Original Message ----- From: "Alexandre Sousa"
> <dave.malkavian em gmail.com>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Friday, November 14, 2008 9:26 AM
> Subject: Re: [firebase-br] Erro na recuperação do valor
>
>
> Olá,
>
> Não é exatamente o firebird que grava alterado. Tente garantir que a
> aplicação passa o número arredondado, porque pelo visto a aplicação está
> deixando passar algumas casas decimais.
>
> Alexandre Sousa
>
>
> ----- Original Message ----- From: "Társis Francke Ferreira"
> <tarsis em mithrandir.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Friday, November 14, 2008 9:06 AM
> Subject: Re: [firebase-br] Erro na recuperação do valor
>
>
> Agora eu vi que no IBExpert ele também retorna dessa forma errada,
> quando se
> vai editar o campo.
> Por que o Firebird grava o número alterado?
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
>
> --------------------------------------------------------------------------------
>
>
>
>
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com
> Version: 8.0.175 / Virus Database: 270.9.3/1786 - Release Date:
> 13/11/2008 18:01
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa
--------------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG - http://www.avg.com
Version: 8.0.175 / Virus Database: 270.9.3/1786 - Release Date: 13/11/2008
18:01
Mais detalhes sobre a lista de discussão lista