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