PostgreSQL - 舍入浮点数

Din*_*esh 8 postgresql

我有一个关于PostgreSQL 9.2中浮点数的新手问题.

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

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

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

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

 round  
--------
 0.3333
(1 row)
Time: 0.917 ms
Run Code Online (Sandbox Code Playgroud)

但是,我真正希望实现的是以下内容:

SELECT round(1/3.::float,4);
Run Code Online (Sandbox Code Playgroud)

目前给我以下错误:

ERROR:  function round(double precision, integer) does not exist at character 8
Time: 0.949 ms
Run Code Online (Sandbox Code Playgroud)

谢谢

Pet*_*uss 12

尝试

SELECT round((1/3.)::numeric,4);
Run Code Online (Sandbox Code Playgroud)

适用于任何版本的PostgreSQL.

在一些PostgreSQL函数中缺少重载,为什么(???):我认为"它是缺乏的",下面显示我的解决方法,但请参阅此讨论以获得更多解释.


重载为投射策略

您可以重载 ROUND函数,

 CREATE FUNCTION ROUND(float,int) RETURNS NUMERIC AS $$
    SELECT ROUND($1::numeric,$2);
 $$ language SQL IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

现在您的指令将正常工作,尝试(创建函数后)

 SELECT round(1/3.,4); -- 0.3333 numeric
Run Code Online (Sandbox Code Playgroud)

但它返回一个类型NUMERIC ...为了保留第一个commom-usage重载,我们可以在提供text参数时返回一个float,

 CREATE FUNCTION ROUND(float, text, int DEFAULT 0) 
 RETURNS FLOAT AS $$
    SELECT CASE WHEN $2='dec'
                THEN ROUND($1::numeric,$3)::float
                -- ... WHEN $2='hex' THEN ... WHEN $2='bin' THEN... 
                ELSE 'NaN'::float  -- is like a error message 
            END;
 $$ language SQL IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

尝试

 SELECT round(1/3.,'dec',4);   -- 0.3333 float!
 SELECT round(2.8+1/3.,'dec',1); -- 3.1 float!
 SELECT round(2.8+1/3.,'dec'::text); -- need to cast string? pg bug 
Run Code Online (Sandbox Code Playgroud)

PS:您可以通过\ df检查重载,

 \df round
  Schema    | Name  | Datatype of result        |    Datatype of parameters                       
 -----------+-------+---------------------------+--------------------------------
 myschema   | round | numeric                   | double precision, integer                                     
 myschema   | round | double precision          | double precision, text, integer
 pg_catalog | round | double precision          | double precision                                              
 pg_catalog | round | numeric                   | numeric                                                       
 pg_catalog | round | numeric                   | numeric, integer                                              
Run Code Online (Sandbox Code Playgroud)

pg_catalog函数是默认函数,请参阅内置数学函数的手册.


Ian*_*ney 10

你可以通过做一些事情来实现这一目标

select round( (21.04 /0.05 ),0)*0.05
Run Code Online (Sandbox Code Playgroud)

21.04圆的数字在哪里,0.05是准确性.