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

Postgresql-如何将数字向下舍入到最接近的重要倍数?,postgresql,rounding,floor,Postgresql,Rounding,Floor,我在PostgreSQL中看到了类似的东西,我可以在Excel中使用FLOOR函数 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;

我在PostgreSQL中看到了类似的东西,我可以在Excel中使用FLOOR函数

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;
$$; 
例如:

=FLOOR(199999;100000)
会给我10万

我尝试使用pgsql:

SELECT round(199999 ,-5)
但这将数字向上取整->200000。

round()

这就是解决问题的方法

SELECT 
    floor(199999 / 100000) * 100000
等于

SELECT
    floor(199999 / pow(10,5)) * pow(10,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 floor(_value / pow(10, _precision)) * pow(10, _precision)
    INTO rounded;
    
    RETURN rounded;
END;
$$ LANGUAGE plpgsql;

SELECT floor_precision(199999, 5)
或者,如果希望将
round()
函数与其第二个参数一起使用,也可以使用此iof:

SELECT 
    round(199999 - 50000, -5)
等于

SELECT
    floor(199999 / pow(10,5)) * pow(10,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)
根据小提琴手的执行计划,第二种变体似乎要快得多。

round()

这就是解决问题的方法

SELECT 
    floor(199999 / 100000) * 100000
等于

SELECT
    floor(199999 / pow(10,5)) * pow(10,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 floor(_value / pow(10, _precision)) * pow(10, _precision)
    INTO rounded;
    
    RETURN rounded;
END;
$$ LANGUAGE plpgsql;

SELECT floor_precision(199999, 5)
或者,如果希望将
round()
函数与其第二个参数一起使用,也可以使用此iof:

SELECT 
    round(199999 - 50000, -5)
等于

SELECT
    floor(199999 / pow(10,5)) * pow(10,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;
$$; 

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

增强答案…非常好的答案-非常感谢!!增强答案…非常好的答案-非常感谢!!