我有一个关于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
是准确性.
归档时间: |
|
查看次数: |
25525 次 |
最近记录: |