Postgresql-如何将数字向下舍入到最接近的重要倍数?
我在PostgreSQL中看到了类似的东西,我可以在Excel中使用FLOOR函数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;
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;
$$;
增强答案…非常好的答案-非常感谢!!增强答案…非常好的答案-非常感谢!!