[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