Evandro Ricardo Silvestre escreveu:
> Salve!
> 
> CREATE TABLE estoque_teste (
>    co_item           float8 NOT NULL,
>    co_estoque        float8 NOT NULL,
>    qt_estoque        float8 NOT NULL,
>    PRIMARY KEY(co_item));
> 
> INSERT INTO estoque_teste(co_item,co_estoque,qt_estoque) VALUES(1,1,150.5)
> UPDATE estoque_teste SET qt_estoque = qt_estoque - 150.4;
> 
> SELECT * FROM estoque_teste
> 
> O valor do campo qt_estoque, ao invés de ser 0.01 ficou 0,0999999999999943.
> 
> Se o UPDATE for dessa maneira: UPDATE estoque_teste SET qt_estoque =
> qt_estoque::numeric - 150.4;
> 
> O valor do campo fica correto, mas o CAST para numeric não é a forma 
> correta de solucionar o problema.
> Imagino que seja algum problema de arredondamento e não sei se é 
> possível definir a forma como o Postgresql arredonda.
> 
> 
> Não gostaria de mudar o tipo de dados da tabela, ela já esta alimentada 
> e é muito grande!
> 
> Fiz o teste nas versões 7.4.2 e 8.2. Em nenhum deu certo!



Este é o problema da aritmética de ponto flutuante, ela é mais rápida 
mas tem o problema da imprecisão, como diz o manual:

"Os tipos de dado real e double precision são tipos numéricos não exatos 
de precisão variável."

"    * Se for necessário armazenamento e cálculos exatos (como em 
quantias monetárias), em vez de tipos de ponto flutuante deve ser 
utilizado o tipo numeric.
     * Se for desejado efetuar cálculos complicados usando tipos de 
ponto flutuante para algo importante, especialmente dependendo de certos 
comportamentos em situações limites (infinito ou muito próximo de zero), 
a implementação deve ser avaliada cuidadosamente.
     * A comparação de igualdade de dois valores de ponto flutuante pode 
funcionar conforme o esperado, ou não. "

Portanto avalie se você pode conviver com esta imprecisão ou é melhor, 
mesmo que dê trabalho, converter os campos float8 para numeric.

[]s
Osvaldo

                
_______________________________________________________ 
Yahoo! Mail - Sempre a melhor opção para você! 
Experimente já e veja as novidades. 
http://br.yahoo.com/mailbeta/tudonovo/
 

_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a