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

时间:2021-02-05 10:41:36

标签: postgresql rounding floor

我在 PostgreSQL 中看起来类似我可以在 Excel 中使用 FLOOR 函数做的事情。

例如:

=FLOOR(199999;100000)

会给我 100 000

我在 pgsql 中尝试过:

SELECT round(199999 ,-5)

但这会将数字向上取整 -> 200000。

2 个答案:

答案 0 :(得分:2)

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 的执行计划,第二个变体似乎要快得多。

答案 1 :(得分:0)

好函数,但可以更进一步,创建一个 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;
$$;