后Ql舍入重要数字



我已经尝试了此博客的这个重要数字查询(https://www.garysieling.com/blog/postgres-significant-figures-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

谢谢您的帮助兄弟!

您可以使用以下功能将以下功能舍入许多重要数字:

CREATE OR REPLACE FUNCTION sig_digits(n anyelement, digits int) 
RETURNS numeric
AS $$
    SELECT CASE
        WHEN n=0 THEN 0
        ELSE round(n, digits - 1 - floor(log(abs(n)))::int)
    END
$$ LANGUAGE sql IMMUTABLE STRICT;

与Laurenz的答案相比,这具有以下差异:

  • 结果是舍入的,没有地板(例如sig_digits(15, 1)20,而不是10(
  • 该功能将任意类型作为第一个参数(例如浮点(,而不仅仅是数字
  • 它更快,因为它避免在数字上调用log(如果可能的话(,并且仅呼叫log一旦
  • 它可以返回漂亮的结果,而没有不必要的尾随零。
  • 它处理零输入

要为此问题提供更一般的答案,我建议您使用以下功能,其中有效数字的数量是可变的:

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)

请注意,该公式不为博客文章声称 round ,但 truncate

舍入数(状态(到最重要的数字的示例:

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

相关内容

  • 没有找到相关文章

最新更新