[firebase-br] Erro na recuperação do valor
Adriano dos Santos Fernandes
adrianosf em uol.com.br
Sex Nov 14 11:43:35 -03 2008
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
Mais detalhes sobre a lista de discussão lista