PostgreSQL - 舍入浮点数

10 浏览
0 Comments

PostgreSQL - 舍入浮点数

我有一个关于 PostgreSQL 9.2 中浮点数的新手问题。\n是否有一个函数可以直接对浮点数进行四舍五入,而无需先将数字转换为数值类型?\n另外,我想知道是否有一个函数可以按任意单位进行四舍五入,比如最接近 0.05 的数?\n当首先将数字转换为十进制形式时,以下查询完美地工作:\n

SELECT round(1/3.::numeric,4);
 round  
--------
 0.3333
(1 row)
Time: 0.917 ms

\n然而,我真正想要实现的是类似以下的内容:\n

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

\n这目前给我报错如下:\n

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

\n谢谢

0
0 Comments

在PostgreSQL中对浮点数进行四舍五入的时候,可能会出现一些问题。这篇文章将介绍为什么会出现这个问题以及如何解决。

问题的出现是由于浮点数的精度问题。在计算机中,浮点数是以二进制来表示的,但是二进制无法精确地表示所有的十进制数。因此,当我们对浮点数进行四舍五入时,可能会出现一些不准确的结果。

为了解决这个问题,我们可以使用PostgreSQL提供的round函数,并指定所需的精度。在上面的例子中,我们使用了如下的代码:

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

在这个例子中,我们将21.04除以0.05得到420.8,然后使用round函数将其四舍五入到最接近的整数,得到421。最后,我们再将421乘以0.05,得到最终的结果21.05。

通过这种方法,我们可以确保对浮点数进行准确的四舍五入操作。需要注意的是,我们在使用round函数时,需要明确指定所需的精度,以避免出现不准确的结果。

总之,当在PostgreSQL中对浮点数进行四舍五入时,可能会出现精度问题。为了解决这个问题,我们可以使用round函数,并明确指定所需的精度。通过这种方法,我们可以确保对浮点数进行准确的四舍五入操作。

0
0 Comments

PostgreSQL是一个功能强大的关系型数据库管理系统,它支持浮点数的舍入操作。然而,在某些情况下,用户可能会遇到舍入浮点数时的问题。本文将介绍出现这个问题的原因以及解决方法。

问题的根源在于PostgreSQL函数的重载问题。在某些PostgreSQL函数中,存在缺少重载的情况。这可能是历史原因导致的。为了解决这个问题,可以开发一个集中和可重用的代码库,实现一种策略。

解决方法之一是使用函数重载来实现类型转换。可以通过以下代码实现对内置的ROUND函数进行重载:

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

通过这种重载方式,用户可以直接对浮点数进行舍入操作。例如,使用以下代码:

SELECT round(1/3.,4);

这将返回一个NUMERIC类型的结果。

另一种解决方法是保留输入数据类型并使用浮点数的所有精度范围。可以通过以下代码实现:

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;

通过这种方式,用户可以根据精度定义返回一个浮点数。例如:

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

为了避免浮点数截断,用户可以在结果中进行修正。例如,可以使用以下代码截断结果,保留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
SELECT round9(1/3., 0.005);    -- 0.335

通过以上方法,用户可以解决在PostgreSQL中舍入浮点数时遇到的问题。

注意:在进行重载后,可以使用`\df round`命令在`psql`中查看函数的相关信息。

更多详细内容请参考[这里](https://stackoverflow.com/a/20934099/287948)。

0