[firebase-br] Erro na recuperação do valor

Josué josue em ciberpoint.com.br
Sex Nov 14 12:03:24 -03 2008


amigos, quase fiquei louco uma vez com um erro numa rotina ao comparar dois 
"float" onde eu via os valores exatamente iguais, mas o computador não. Só 
resolveu quado, antes de comparar eu convertia os valores apresentados para 
duas variaveis "string" tirava os espaços e ai sim comparava os valores.

----- Original Message ----- 
From: "Adriano dos Santos Fernandes" <adrianosf em uol.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Friday, November 14, 2008 11:43 AM
Subject: Re: [firebase-br] Erro na recuperação do valor


Eduardo Bahiense escreveu:
>
> 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.
>
Que eu saiba isso é relacionado ao modelo IEEE usado, ou seja,
processadores de mesma arquitetura teriam que ter valores idênticos.

> 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.
>
Currency seria um double de 80 bits, não? O problema é que só aumenta a
precisão, não resolvendo se vc precisar de uma precisão alta. No Java,
usa-se BigDecimal que é uma classe com lógica própria para operações com
números BCD.

> Observe que,mesmo em ACCESS, ou qualquer outro SGBD, ou mesmo em PARADOX, 
> o descrito acima é verdadeiro.
>
E em qualquer linguagem. A primeira vez que vi este tipo de problema foi
em um warning que dizia que um if com uma divisão de constantes
comparado com o valor que teria que dar nunca seria executado. :-)


Adriano


______________________________________________
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

__________ Informação do ESET NOD32 Antivirus, versão da vacina 3613 
(20081114) __________

A mensagem foi verificada pelo  ESET NOD32 Antivirus.

http://www.eset.com






Mais detalhes sobre a lista de discussão lista