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
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a