Postgres method使用哪个round(v numeric, s int)
?
我正在寻找文档参考。
答案 0 :(得分:6)
抱歉,我在文档中没有看到任何暗示,但a look at the code表示它使用从零开始的一半; carry
始终添加到digits
,从而增加变量的绝对值,而不管其sign
是什么。一个简单的实验(psql 9.1)证实了这一点:
test=# CREATE TABLE nvals (v numeric(5,2));
CREATE TABLE
test=# INSERT INTO nvals (v) VALUES (-0.25), (-0.15), (-0.05), (0.05), (0.15), (0.25);
INSERT 0 6
test=# SELECT v, round(v, 1) FROM nvals;
v | round
-------+-------
-0.25 | -0.3
-0.15 | -0.2
-0.05 | -0.1
0.05 | 0.1
0.15 | 0.2
0.25 | 0.3
(6 rows)
有趣,因为round(v dp)
使用一半甚至:
test=# create table vals (v double precision);
CREATE TABLE
test=# insert into vals (v) VALUES (-2.5), (-1.5), (-0.5), (0.5), (1.5), (2.5);
INSERT 0 6
test=# select v, round(v) from vals;
v | round
------+-------
-2.5 | -2
-1.5 | -2
-0.5 | -0
0.5 | 0
1.5 | 2
2.5 | 2
(6 rows)
后一种行为几乎肯定是依赖于平台的,因为它看起来像it uses rint(3) under the hood。
如有必要,您可以随时实施不同的舍入方案。有关示例,请参阅Tometzky's answer。
答案 1 :(得分:3)
没有记录,所以它可以改变。
以下是我的create or replace function round_half_even(val numeric, prec integer)
returns numeric
as $$
declare
retval numeric;
difference numeric;
even boolean;
begin
retval := round(val,prec);
difference := retval-val;
if abs(difference)*(10::numeric^prec) = 0.5::numeric then
even := (retval * (10::numeric^prec)) % 2::numeric = 0::numeric;
if not even then
retval := round(val-difference,prec);
end if;
end if;
return retval;
end;
$$ language plpgsql immutable strict;
:
round_half_odd(numeric,integer)
create or replace function round_half_odd(val numeric, prec integer)
returns numeric
as $$
declare
retval numeric;
difference numeric;
even boolean;
begin
retval := round(val,prec);
difference := retval-val;
if abs(difference)*(10::numeric^prec) = 0.5::numeric then
even := (retval * (10::numeric^prec)) % 2::numeric = 0::numeric;
if even then
retval := round(val-difference,prec);
end if;
end if;
return retval;
end;
$$ language plpgsql immutable strict;
:
round(numeric,integer)
他们每秒管理大约500000次调用,比标准{{1}}慢6倍。它们也适用于零和负精度。