我已经尝试了此博客的这个重要数字查询(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