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。
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;
$$;
我在 PostgreSQL 中寻找类似的东西我可以在 Excel 中使用 FLOOR 函数来做。
例如:
=FLOOR(199999;100000)
给我10万
我在 pgsql 中试过:
SELECT round(199999 ,-5)
但是这轮数向上 -> 200000。
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;
$$;