1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ubuntuのjqコマンドで四捨五入する(round, ceil関数がない場合と、その対策)

Last updated at Posted at 2020-10-13

はじめに

jqコマンドで四捨五入するための四苦八苦を記載します。

環境

カテゴリ バージョン
OS Ubuntu 18.04(WSL 1)
jqコマンド jq-1.5-1-a5b5cbe (aptからインストール)

aptでインストールできるjqコマンドは、普通に演算で使う、四捨五入のround関数、切り上げのceil関数が使えません。

$ echo '{"a":100,"b":8}' |jq '.a / .b'
12.5

$ echo '{"a":100,"b":8}' |jq '(.a / .b)|floor' #切り捨て
12

$ echo '{"a":100,"b":8}' |jq '(.a / .b)|round' # 四捨五入したい -> 13
jq: error: round/0 is not defined at <top-level>, line 1:
(.a / .b)|round
jq: 1 compile error

$ echo '{"a":100,"b":8}' |jq '(.a / .b)|ceil' #切り上げたい -> 13
jq: error: ceil/0 is not defined at <top-level>, line 1:
(.a / .b)|ceil

マニュアルによると「C言語ライブラリの関数は使える」という感じでしたが、使えない関数もあるようです。

Availability of standard math functions depends on the availability of the corresponding math functions in your operating system and C math library. Unavailable math functions will be defined but will raise an error.

というわけで、他の方法で回避します。

四捨五入する(round)


$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.5 | floor' #100 / 8 = 12.5
13

切り上げる(ceil)

※JSONの演算結果が小数第一位までであることが前提のコードです

$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.9 | floor' #100 / 8 = 12.5
13

テスト

# 四捨五入
$ echo '{"a":100,"b":8}' |jq '(.a / .b) - 0.1 + 0.5 | floor' # 12.5 - 0.1 = 12.4
12
$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.5 + 0.5 | floor' # 12.5 + 0.5 = 13
13

# 切り上げ
$ echo '{"a":100,"b":8}' |jq '(.a / .b) -0.1 + 0.9 | floor' # 12.5 - 0.1 = 12.4
13
$ echo '{"a":100,"b":8}' |jq '(.a / .b) + 0.5 + 0.9 | floor' # 12.5 + 0.5 = 13
13

余談

検索してみると、jq 1.6なら対応しているとか、ディストリビューションによって使える関数が異なるとか、このあたりの議論が錯綜しているようです。
https://stackoverflow.com/questions/59063536/how-to-round-floor-ceil-truncate

(´-`).。oO(素直に公式のjqを使った方がいいかもしれません)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?