GARANTIR DESCONTO

Fórum Erro de calculo #26682

10/01/2007

0

Ola pessoal sou novo nesse fórum, unir as forças sempre foi uma boa idéa.
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

Rogério Grando

Responder

Posts

11/01/2007

Andersonpgsql

mas qual é o erro amigo?


Responder

Gostei + 0

11/01/2007

Rogério Grando

O problema é que o resultado correto da conta seria 0,01 e não 0.00999999999999091, esta ocorrendo algum problema no arredondamento do tipo float8.
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.


Responder

Gostei + 0

11/01/2007

Rogério Grando

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar