如何在jq jq-1.5-1-a5b5cbe中对数字进行舍入,舍入,舍位和截断?
例如,对于{"mass": 188.72}
,我希望{"mass": 188}
的地板,{"mass": 189}
的天花板和圆形。
周围的例子:
5.52 --> 6
5.50 --> 5 or 6
-5.52 --> -6
截断示例:
5.52 --> 5
5.50 --> 5
-5.52 --> -5
我想出了-5 as $n | if $n > 0 then [range($n+0.00000000000001)] else [range(-$n)] end | last
进行截断的方法,但是它不必要地复杂(并且可能包含错误)。
答案 0 :(得分:3)
某些内部版本可能缺少这些功能,但是就我而言,floor
广泛可用;因此,您可以使用它来实现它们。
def round: . + 0.5 | floor;
def ceil: . + 1.0 | floor;
def trunc: if . < 0 then ceil else floor end;
答案 1 :(得分:1)
jq的数学内置函数在jq手册的“数学”部分中进行了枚举。当前版本为https://stedolan.github.io/jq/manual/; 较早版本的链接在顶部。
请注意,jq 1.5和1.6都具有名为round
,ceil
,floor
和trunc
的内建函数:它们都是0-arity过滤器。
例如
[5.52, 5.50, -5.52 ] | map(trunc)
#=> [5,5,-5]
jq的早期版本具有不同的Math函数集,例如jq 1.4具有floor
,但没有其他三个。
答案 2 :(得分:0)
在jq 1.6中,您可以访问圆形/天花板/地板功能
$ echo '{"mass": 188.72}' | jq ' .mass | round '
189
$ echo '{"mass": 188.72}' | jq ' .mass | ceil '
189
$ echo '{"mass": 188.72}' | jq ' .mass | floor '
188
$
对于jq 1.5,这是hack
圆形:
$ echo '{"mass": 188.42}' | jq ' .mass + 0.5 | tostring | split(".") | .[0] ' -r
188
天花板(可能需要增加9999s来提高精度):
$ echo '{"mass": 188.42}' | jq ' .mass + 0.99999999 | tostring | split(".") | .[0] ' -r
189
楼层:
$ echo '{"mass": 188.42}' | jq ' .mass | tostring | split(".") | .[0] ' -r
188