bashで小数点を含む計算を行う方法
bashで計算を行う方法には下記の方法がありますが、計算式や解答に小数点がはいると計算ができなかったり、計算結果の小数点以下が表示されなかったりします。
- expr 計算式
- echo $((計算式))
少数点を含む計算式が入力できない例
計算式に小数点が含まれていると、「expr 計算式」「echo $((計算式))」どちらの場合もエラーになってしまいます。
$ expr 1 + 2.5 expr: non-integer argument
※日本語メッセージだと「expr: 整数でない引数」と表示されます。
$ echo $((1 + 2.5)) bash: 1 + 2.5: syntax error: invalid arithmetic operator (error token is ".5")
※日本語メッセージだと「bash: 1 + 2.5: 構文エラー: 無効な計算演算子です (エラーのあるトークンは ".5")」と表示されます。
計算結果に小数点が表示されない例
計算結果に小数点を含む場合、整数部分のみしか表示されません。
$ expr 10 / 3 3
$ echo $((10 / 3)) 3
小数点を含む計算を行う方法(bcコマンドを使用)
小数点を含む計算を行うにはどうすればよいかというと、「bc」コマンドに計算式を読み込ませることで、小数点を含む計算を行うことができるようになります。
「bc」コマンドに計算式を読み込ませる方法は下記のような方法があります。
$ echo "scale=小数点以下の桁数; 計算式" | bc $ bc <<< "scale=小数点以下の桁数; 計算式" $ bc << EOF > scale=小数点以下の桁数; 計算式 > EOF
計算例
echoとbcを組み合わせて計算する場合の実行例です。
$ echo "scale=5; 10 / 3" | bc 3.33333
bcコマンドに計算式をリダイレクトさせて計算する場合の実行例です。
$ bc <<< "scale=5; 10 / 3" 3.33333
bcコマンドにヒアドキュメントで計算式を送り込んで計算する場合の例です。
$ bc << EOF > scale=5; 10 / 3 > EOF 3.33333
先頭の「0」が表示されない
bcで計算を行う場合、計算結果が「0.25」といったような場合、先頭の「0」が表示されません。
$ echo "scale=2; 1 / 4" | bc .25
「.25」でも計算結果としてはわかりますが、「0.25」と表示させたい場合もあると思いますので、先頭の「0」を表示させる方法を紹介します。
先頭の0を表示させる方法
先頭の「0」を表示させる方法として以下の方があります。
- echo "scale=桁数; 計算式" | bc | xargs printf "%.桁数f\n"
- echo "scale=桁数; 計算式" | bc | awk '{printf "%.桁数f\n", $0}'
- echo "scale=桁数; 計算式" | bc | sed 's/^\./0./
「scale=桁数」で設定した桁数と「printf "%.桁数f\n"」で設定する桁数は、同じ値にする必要があります。
実行例
xargsを使用
「xargs」で計算結果を「printf」に渡して、「%.桁数f」で表示する小数点以下の数を設定しています。
「\n」は改行を意味しています。
小数点以下の2桁を表示させたい場合は、「scale=2」「printf "%.2f\n"」といったように指定します。
$ echo "scale=2; 1 / 4" | bc | xargs printf "%.2f\n" 0.25
awkを使用
「awk」で計算結果を「printf」に渡して、「printf "%.2f\n"」で表示する小数点以下の数を設定しています。
「\n」は改行を意味しています。
「$0」は|(パイプ)で渡された値すべてを意味しています。
$ echo "scale=2; 1 / 4" | bc | awk '{printf "%.2f\n", $0}' 0.25
sedを使用
先頭が「.」の場合、sedで「0.」に書き換えています。
$ echo "scale=2; 1 / 4" | bc | sed 's/^\./0./' 0.25
コメント