Em 19/07/12, Matheus de Oliveira<matioli.math...@gmail.com> escreveu:
> Bom, vou tentar fugir um pouco do PostgreSQL e ir para o mundo do C.
>
> No C é comun compararmos igualdade de float/double da seguinte forma:
>
> #define EPS 0.000000001 // precisão
>
> if (valor >= 355.55 - EPS && valor <= 355.55 + EPS) {
>     // valor igual
> } else {
>     // valor diferente
> }
>
> Explicando, o mundo binário tem problemas de dizimas periódicas assim como
> no mundo decimal, mas as dizimas são causadas por números (frações)
> diferentes, com isso a conversão binário -> decimal e o inverso pode gerar
> erros (geralmente pequenos), por isso, quando compara-se igualdade
> coloca-se uma margem de erro, geralmente chamada EPSILON (a cte EPS acima).
>
> Agora, voltando ao PostgreSQL, não sei "exatamente" se ele converte o
> numeric pra binário, mas parece que sim (já que disseram que é gravado como
> float), então deixo mais algumas opções para que tente:
>
> SELECT * FROM tabela WHERE valor BETWEEN 355.55 - 0.000000001 AND 355.55 +
> 0.000000001
>
> e, só por desencargo:
>
> SELECT * FROM tabela WHERE valor = 355.55::numeric(14, 4)
>
>
> E segundo é só porque não sei se ele está convertendo o valor pra float ou
> o 355.55 pra numeric na verificação, assim temos certeza.
>
> Atenciosamente,
> --
> Matheus de Oliveira
>


Pessoal:

Não tem muito sentido falar em ponto flutuante neste caso.
O tipo de dados NUMERIC é, segundo o manual: "The type numeric can
store numbers with a very large number of digits and perform
calculations exactly.".
Ou seja ele é indicado, apesar de suas operações serem mais demoradas,
para os casos em que necessitamos de cálculos exatos, não tendo os
problemas inerentes à aritmética de ponto flutuante.

Em minha opinião, o presente caso só pode ser atribuído à alteração do
tipo de dados da base. Para mim não ficou claro se o Vinicius
recarregou a tabela após a modificação ou fez um update com a cláusula
USING no comando ALTER TABLE.

Osvaldo
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a