如何解决Postgresql - 如何将数字向下舍入到最接近的重要性倍数?
我在 Postgresql 中看起来类似我可以在 Excel 中使用 FLOOR 函数做的事情。
例如:
=FLOOR(199999;100000)
会给我 100 000
我在 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 * -1)::int;
$$;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。