如何圆、地板、塞伊尔、截断



如何在 jq jq-1.5-1-a5b5cbe 中对数字进行舍入、地板、塞伊尔和截断?

例如,对于{"mass": 188.72},我想要{"mass": 188}地板,{"mass": 189}带有ceil和圆形。

舍入示例:

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,但它不必要地复杂(并且可能包含错误(。

某些版本可能缺少这些功能,但就我而言,floor是广泛使用的; 因此,您可以使用它来实现它们。

舍入/0

def round: . + 0.5 | floor;

塞伊尔/0

def ceil: if . | floor == . then . else . + 1.0 | floor end;

截断/0

def trunc: if . < 0 then ceil else floor end;

在 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,这是黑客

圆:

$ echo '{"mass": 188.42}' | jq ' .mass + 0.5 | tostring | split(".") | .[0] '  -r
188

天花板(可能需要添加更多 9999 以提高精度(:

$ echo '{"mass": 188.42}' | jq ' .mass + 0.99999999 | tostring | split(".") | .[0] '  -r
189

地板:

$ echo '{"mass": 188.42}' | jq ' .mass | tostring | split(".") | .[0] '  -r
188

jq 的数学内置在 jq 手册的数学部分枚举。当前版本 https://stedolan.github.io/jq/manual/; 指向早期版本的链接位于顶部。

注意jq 1.5和1.6都有名为roundceilfloortrunc的内置滤波器:它们都是0-arity滤波器。

例如

[5.52, 5.50, -5.52 ] | map(trunc)
#=> [5,5,-5]

早期版本的 jq 有不同的数学函数集,例如 jq 1.4 有floor,但其他三个没有。

相关内容

  • 没有找到相关文章

最新更新