Postgresql四舍五入到重要数字

时间:2018-02-21 08:13:46

标签: postgresql math postgresql-9.6 significant-digits

我已经从这个博客(https://www.garysieling.com/blog/postgres-significant-figures-pg_size_pretty)尝试了这个有意义的数字查询。

但它似乎有固定的十进制数字。

SELECT FLOOR(5.4321/(10 ^ FLOOR(log(5.4321)-1))) * (10 ^ FLOOR(log(5.4321)-1))

上述查询的结果是5.4。 如何实现查询以创建这些结果?

number | sigfig
5.4321 | 5.43
10.987 | 10.9
550.75 | 550
9850.5 | 9850
ect

谢谢你帮助兄弟!

3 个答案:

答案 0 :(得分:1)

为了对这个问题提供更一般的答案,我建议您使用以下函数,其中有效位数是可变的:

CREATE FUNCTION significant_digits(n numeric, digits integer) RETURNS numeric
   LANGUAGE sql IMMUTABLE STRICT AS
'SELECT floor(n / (10 ^ floor(log(n) - digits + 1)))
        * (10 ^ floor(log(n) - digits + 1))';

然后你得到以下内容:

test=> SELECT significant_digits(5.4321, 3);
 significant_digits 
--------------------
 5.4300000000000000
(1 row)

test=> SELECT significant_digits(9.87654, 3);
 significant_digits 
--------------------
 9.8700000000000000
(1 row)

请注意,公式不会像博客文章声明的那样围绕,但截断

答案 1 :(得分:0)

您可以使用以下功能将数字四舍五入到一个有效数字:

CREATE OR REPLACE FUNCTION sig_digits(n anyelement, digits int) 
RETURNS numeric
AS $$
    SELECT round(n, digits - 1 - floor(log(n))::int)
$$ LANGUAGE sql IMMUTABLE STRICT;

与Laurenz的答案相比,存在以下差异:

  • 结果是四舍五入的,而不是下限的(例如sig_digits(15, 1)20,而不是10
  • 该函数将任意类型(不仅是数字)作为第一个参数(例如浮点数)
  • 速度更快,因为它避免了在可能的情况下在数字上调用log(这很慢),并且只调用了一次log
  • 它返回漂亮的结果,而没有不必要的尾随零。

答案 2 :(得分:0)

将计数(状态)舍入到最高有效位的示例:

select count(status),
  round(count(status) / pow(10, trunc(log(count(status))) ) ) * pow(10, trunc(log(count(status))) ) 
  from  some_table;

Eg. 1234 => 1000
    987  => 900