最佳答案
它没有记录,所以它可以改变。
这是我的round_half_even(numeric,integer)
:
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;
他们每秒处理大约 500000 次调用,比标准 round(numeric,integer)
慢 6 倍。它们也适用于零精度和负精度。
关于PostgreSQL 回合(v 数字,s int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22613702/