尝试这个:
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
有人可以解释为什么最后一个查询返回 14 而不是 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)
numeric
这是舍入和float
类型之间的不一致。通常,依靠浮点的精确舍入可以在精确的边界值处产生令人惊讶的结果,因为许多十进制值并没有精确地以浮点表示。
如果您想要严格的舍入,请考虑
numeric
一致地使用类型。您可能还会发现显式round
函数很有用。不幸的是,据我所知,PostgreSQL 不提供可选的舍入规则或
round
允许您选择舍入模式(银行家舍入、总是向下、偶数、奇数等)的变体,就像Java提供的那样。