PostgreSQL 中的 round(numeric,integer) 函数只四舍五入:
round(cast (41.0255 as numeric),3) ==> 41.026
因为我们需要一个返回 41.025 的 round 函数并且(非常令人惊讶)在 PostgreSQL 中没有这样的函数(我们使用的是 9.1.5),所以我们编写了一个“包装器”函数,它在第一个版本中非常幼稚并且粗糙...但是由于在 plpgsql 中缺乏对此类问题的本机支持,我们没有找到更好的方法。
代码如下所示。问题是它对于我们的目的来说太慢了。你能建议一个更好的方法来处理这个任务吗?
这是代码:
CREATE OR REPLACE FUNCTION round_half_down(numeric,integer) RETURNS numeric
AS $$
DECLARE
arg ALIAS FOR $1;
rnd ALIAS FOR $2;
tmp1 numeric;
res numeric;
BEGIN
tmp1:=arg;
IF cast(tmp1 as varchar) ~ '5$' THEN res:=trunc(arg,rnd);
ELSE res:=round(arg,rnd);
END IF;
RETURN res;
END;
$$ LANGUAGE plpgsql;
我需要转换数值并使用正则表达式......这就是(我想)扼杀表演的原因。
你知道:我们需要这个,因为我们必须比较存储在两个不同列(在两个不同表上)但具有不同数字数据类型的数字:一个是双精度数,一个是实数。问题是当插入一个真实的数据类型列时,PostgreSQL 执行 ROUND HALF DOWN 而它没有通过它的数学函数提供这样的选项!
编辑:
该功能实际上是错误的。是第一次快速重写,试图提高工作功能的性能,但速度很慢。
行为必须符合以下条件:
IF
四舍五入中推迟的小数位被四舍五入<=5 => trunc
ELSE
。
一些例子:
select round_half_down(cast (41.002555 as numeric),3) -- 41.002
select round_half_down(cast (41.002555 as numeric),4) -- 41.0025
select round_half_down(cast (41.002555 as numeric),5) -- 41.00255
而 PostgreSQL 中的 round 函数给出:
select round(cast (41.002555 as numeric),3) -- 41.003