Bashシェルスクリプトで浮動小数点計算(答えが小数となる除算)
はじめに
Bashの組み込みの数値演算機能では、少数が取り扱えません。
$ X=10
$ Y=2
$ Z=4
# こちらは問題ない
$ echo $((X/Y))
5
# これでも結果はおなじ
$ echo $(($X/$Y))
5
# こちらの結果がおかしい
$ echo $((X/Z))
2echo $((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意外にも、一番しっくり来る表示結果です。







ディスカッション
コメント一覧
まだ、コメントがありません