我已经从这个博客(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
谢谢你帮助兄弟!
答案 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