Tente isto:
create table test (f float);
insert into test values (330.0);
commit;
select (8 + 330.0/60)::int; --14
select (8 + f/60)::int from test; --14
select (9 + 330.0/60)::int; --15
select (9 + f/60)::int from test; --14
Alguém pode explicar por que a última consulta retorna 14 em vez de 15?
PostgreSQL 9.3.9 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
12.04.5 LTS (GNU/Linux 3.2.0-63-virtual x86_64)
É uma inconsistência entre o arredondamento
numeric
efloat
os tipos.Em geral, confiar no arredondamento exato do ponto flutuante pode produzir resultados surpreendentes em valores de borda exatos, porque muitos valores decimais não são representados exatamente no ponto flutuante.
Se você deseja um arredondamento estrito, considere trabalhar com
numeric
tipos consistentemente.round
Você também pode achar útil a função explícita .Infelizmente, até onde eu sei, o PostgreSQL não oferece regras de arredondamento selecionáveis ou uma
round
variante que permite escolher o modo de arredondamento (arredondamento de banqueiros, sempre para baixo, par, ímpar, etc) como o fornecido pelo Java .