当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL-舍入浮点数

岳迪
2023-03-14

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

有没有直接舍入浮点数的函数,即不需要先将数字转换为数字类型?

另外,我想知道是否有一个函数可以用任意的度量单位进行取整,例如精确到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

谢啦

共有2个答案

顾赞
2023-03-14

您可以通过按照以下方式做一些事情来实现这一点:

select round( (21.04 /0.05 ),0)*0.05

其中21.04是要舍入的数字,0.05是精度。

云啸
2023-03-14

尝试

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

适用于任何版本的PostgreSQL。

在一些PostgreSQL函数中缺乏重载,为什么(???):我认为“这是一种缺乏”,下面显示了我的解决方案,但请参阅此讨论以获得更多解释。

您可以使用,

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

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

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

但它会返回一个数字类型。。。为了保留第一个常用用法重载,我们可以在提供文本参数时返回一个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;

尝试

 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 

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                                              

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

 类似资料:
  • 问题内容: 我不知道这是否是一个明显的错误,但是在运行Python脚本以更改模拟参数时,我意识到缺少和的结果。在调查中,我注意到以下Python代码: 生成的相同文件的增量= 0.28和0.29,与.57和.58相同,原因是python返回float(29)/ 100为。但这不是系统错误,从某种意义上说,它并不是每个整数都发生的。因此,我创建了以下Python脚本: 而且我看不到发生这种舍入错误的

  • 问题内容: 有没有办法将python浮点数舍入为x小数?例如: 我已经找到了修剪/截断它们的方法(66.666666666-> 66.6666),但是不是圆形的(66.666666666-> 66.6667)。 问题答案: 使用内置功能: 帮助: round(number [,ndigits])->浮点数 将数字四舍五入到给定的精度(以十进制数字表示)(默认为0位数)。这总是返回一个浮点数。精度可

  • 问题内容: 我期望的是0.313而不是0.312,为什么会这样呢?还有其他方法可以用来获得0.313吗? 谢谢 问题答案: Python 3使用舍入到偶数方法根据IEEE 754标准进行舍入。 如果您想采用另一种方式取整,则只需手动实施即可: 用法示例: 注意: 在python2中,舍入总是远离零,而在python3中,它舍入为偶数。(例如,请参见功能文档中的2.7和3.3之间的区别)。

  • 我将货币值作为浮动存储在mysql表中。 问题是,mysql正在向上或向下舍入数字。 例如,12345.68四舍五入为12345.7 如何停止此操作,或者是否应该使用更好的数据类型? 我希望将原始值保留在小数点后2位以内。

  • 我不明白为什么这是1.0。它不应该是0.999999999999吗?因此,我提出了一种解决方案,python对其答案进行了自动舍入,但如果大于,则无法解释以下结果。。。 我以为四舍五入错误是因为尾数中使用的位数有限,指数(浮点数),但0.9999~~9也没有超出位数的限制...有人能解释一下为什么这些结果会这样吗?

  • 我写了这段代码,它只是对n个数字的列表进行求和,以练习浮点运算,但我不明白这一点: 我正在使用float,这意味着我有7位精度,因此,如果我执行10002*10002=100040004的操作,数据类型float的结果将是100040000.000000,因为我丢失了第7位以外的任何数字(程序仍然知道指数,如图所示)。 如果此程序中的输入是 然而,您将看到,当这个程序计算30003*30003=9