Bashシェルスクリプトで浮動小数点計算(答えが小数となる除算)
はじめに
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
意外にも、一番しっくり来る表示結果です。
ディスカッション
コメント一覧
まだ、コメントがありません