Postgresql - 如何将数字舍入到最接近的重要倍数?

Postgresql - How to round number down to nearest multiple of significance?

我在 PostgreSQL 中寻找类似的东西我可以在 Excel 中使用 FLOOR 函数来做。

例如:

=FLOOR(199999;100000)

给我10万

我在 pgsql 中试过:

SELECT round(199999 ,-5)

但是这轮数向上 -> 200000。

demos:db<>fiddle

round() 总是向下取整 0-4,向上取整 5-9,所以你不能用这个来实现下限取整。

这就是实现它的方法。

SELECT 
    floor(199999 / 100000) * 100000

等于

SELECT
    floor(199999 / pow(10,5)) * pow(10,5)

这样你就可以编写自己的函数了:

CREATE OR REPLACE FUNCTION floor_precision(_value int, _precision int)
RETURNS integer AS $$
DECLARE
    rounded integer;
BEGIN
    SELECT floor(_value / pow(10, _precision)) * pow(10, _precision)
    INTO rounded;
    
    RETURN rounded;
END;
$$ LANGUAGE plpgsql;

SELECT floor_precision(199999, 5)

或者,如果您喜欢使用带有第二个参数的 round() 函数:

SELECT 
    round(199999 - 50000, -5)

等于

SELECT 
    round(199999 - (pow(10,5) / 2)::int, -5)

当然,你也可以在这里创建一个自己的函数:

CREATE OR REPLACE FUNCTION floor_precision(_value int, _precision int)
RETURNS integer AS $$
DECLARE
    rounded integer;
BEGIN
    SELECT round(_value - (pow(10, _precision) / 2)::int, _precision * -1)
    INTO rounded;
    
    RETURN rounded;
END;
$$ LANGUAGE plpgsql;

SELECT floor_precision(199999, 5)

根据 fiddle 的执行计划,第二种变体似乎要快得多。

不错的功能,但可以更进一步,创建一个 SQL 功能。

create or replace 
function floor_precision(_value int, _precision int)
 returns integer
 language sql
 immutable  strict
as $$
    select round(_value - (pow(10, _precision) / 2)::int, _precision * -1)::int;
$$;