Bashシェルスクリプトで浮動小数点計算(答えが小数となる除算)

2021-06-29Bash,CentOS,Cygwin,Linux,Ubuntu

はじめに

Bashの組み込みの数値演算機能では、少数が取り扱えません。

$ X=10
$ Y=2
$ Z=4

# こちらは問題ない
$ echo $((X/Y))
5

# これでも結果はおなじ
$ echo $(($X/$Y))
5

# こちらの結果がおかしい
$ echo $((X/Z))
2

echo $((X/Z)) の実行結果は 2.5 となってほしいが、小数点以下が切り捨てられてしまいます。

対処方法はいくつかあります。

bc コマンド を使う

# このままだと変わりなし
$ bc <<< "$X/$Z"
2

# 少数第何位まで計算するかを指定
$ bc <<< "scale=4; $X/$Z"
2.5000

$ # 無限循環小数
$ bc <<< "scale=4; $X/3"
3.3333

問題は scale の値をいくつにするかを予め知っておかないといけないこと。
卵が先か、鶏が先か。

bc -l でもっとよしなにしてくれるようです。

$ bc -l <<< "$X/$Z"
2.50000000000000000000

$ bc -l <<< "$X/3"
3.33333333333333333333

割り切れたのかよくわかりませんね。

awk コマンドを使う

awk 最強?

$ awk "BEGIN { print $X/$Z }"
2.5

# 循環小数が何故切れたのかは不明
$ awk "BEGIN { print 10/3 }"
3.33333

循環小数はなぜ切れた。

python コマンドを使う

最近では、 python はほぼプリインストールと考えて良い言語実行系となりましたね。

$ python -c "print($X/$Z)"
2.5

$ python -c "print(10/3)"
3.3333333333333335

しっくりきますね。

php コマンドを使う

バカにされ続けた言語ですが、僕は好きです。

$ php -r "echo($X/$Z);"
2.5

$ php -r "echo(10/3);"
3.3333333333333

意外にも、一番しっくり来る表示結果です。

2021-06-29Bash,CentOS,Cygwin,Linux,Ubuntu