gpt4 book ai didi

PostgreSQL - 四舍五入 float

转载 作者:行者123 更新时间:2023-11-29 11:18:25 27 4
gpt4 key购买 nike

我有一个关于 PostgreSQL 9.2 中 float 的新手问题。

是否有直接舍入 float 的函数,即不必先将数字转换为数字类型?

另外,我想知道是否有一个函数可以按任意度量单位舍入,例如最接近的 0.05?

首先将数字转换为十进制形式时,以下查询完美运行:

SELECT round(1/3.::numeric,4);

round
--------
0.3333
(1 row)
Time: 0.917 ms

但是,我真正想要实现的是如下内容:

SELECT round(1/3.::float,4);

目前出现以下错误:

ERROR:  function round(double precision, integer) does not exist at character 8
Time: 0.949 ms

谢谢

最佳答案

您的解决方案适用于任何版本的 PostgreSQL,

SELECT round(1/3.::numeric,4);

但是“是否有直接舍入 float 的函数?”的答案是没有

转换问题

您正在报告一个众所周知的“错误”,在某些 PostgreSQL 函数中缺少重载...为什么 (???):我认为“缺少重载”( !),但@CraigRinger、@Catcall(参见 comments at Craig's anser)和 PostgreSQL 团队同意“PostgreSQL 的历史基本原理”

解决方案是开发一个集中式且可重复使用的“片段库”,例如 pg_pubLib .它实现了下面描述的策略。

重载作为转换策略

您可以 overload内置 ROUND 函数,

 CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $f$
SELECT ROUND($1::numeric,$2);
$f$ language SQL IMMUTABLE;

现在你的梦想将成为现实,试试吧

  SELECT round(1/3.,4); -- 0.3333 numeric

它返回一个(十进制)NUMERIC 数据类型,这对某些应用程序来说很好......另一种方法是使用 round(1/3.,4)::float 或创建一个 round_tofloat() 函数。

其他选择,保留输入数据类型并使用 accuracy-precision 的所有范围 float (参见 IanKenney's answer ),是在定义精度时返回一个 float ,

CREATE or replace FUNCTION ROUND(
input float, -- the input number
accuracy float -- accuracy
) RETURNS float AS $f$
SELECT ROUND($1/accuracy)*accuracy
$f$ language SQL IMMUTABLE;
COMMENT ON FUNCTION ROUND(float,float) IS 'ROUND by accuracy.';

尝试

 SELECT round(21.04, 0.05);     -- 21.05 
SELECT round(21.04, 5::float); -- 20
SELECT round(pi(), 0.0001); -- 3.1416
SELECT round(1/3., 0.0001); -- 0.33330000000000004 (ops!)

为避免浮点截断(内部信息丢失),您可以“清理”结果,例如截断 9 位数字:

CREATE or replace FUNCTION ROUND9(
input float, -- the input number
accuracy float -- accuracy
) RETURNS float AS $f$
SELECT (ROUND($1/accuracy)*accuracy)::numeric(99,9)::float
$f$ language SQL IMMUTABLE;

尝试

  SELECT round9(1/3., 0.00001);  -- 0.33333 float, solved!
SELECT round9(1/3., 0.005); -- 0.335 float, ok!

PS:命令\df round,在psql 重载后,会显示类似这张表的内容

 Schema     |  Name | Result  | Argument  ------------+-------+---------+------------------ myschema   | round | numeric | float, int myschema   | round | float   | float, float pg_catalog | round | float   | float             pg_catalog | round | numeric | numeric    pg_catalog | round | numeric | numeric, int          

floatdouble precision 的同义词,myschema 在不使用模式时是 publicpg_catalog 函数是默认函数,参见指南 build-in math functions .


更多详情

查看完整的 Wiki answer here .

关于PostgreSQL - 四舍五入 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246886/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com