Fórum Erro de calculo #26682
10/01/2007
0
Estou com um problemão aki, trabalho com a versão 7.4 do PostgreSQL, possuo um campo qt_estoque do tipo float8, quando faço calculo com de update ex:
Valor inicial do qt_estoque = 153.13.
UPDATE estoqueitem SET qt_estoque = qt_estoque -153.12;
Valor final do qt_estoque = 0.00999999999999091
Testei na versão 8.2 do PostgreSQL e ocorre o mesmo erro.
Rogério Grando
Curtir tópico
+ 0Posts
11/01/2007
Andersonpgsql
Gostei + 0
11/01/2007
Rogério Grando
Abaixo esta um script para que possa verificar.
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 fica 0,0999999999999943.
Gostei + 0
11/01/2007
Rogério Grando
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)