それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

シェルbash で小数の計算するコマンド

bcコマンドを使います。

sudo apt install bc

bc コマンドは少数を計算

bash の四則演算で小数点は消えます。

ええ、消えちゃうんですよ。めんどくさいことに、小数点を扱うのは、コツが居るみたいなんです。

1〜10の連番を作ってみる
takuya@~/Desktop$ for i in {1..10} ; do echo $((1*$i))  ;  done
1
2
3
4
5
6
7
8
9
10
小数点を計算してみる

$i / 10 にして、0.1 から 1.0までの値を出すことにする、もちろん出来ない。

takuya@~/Desktop$ for i in {1..10} ; do echo $((1/$i))  ;  done
1
0
0
0
0
0
0
0
0
0

出来ませんね。桁落ちします。

expr でもダメ。

$( ( 1 + 1 ) ) の他にexpr も記述できますがもちろんダメ。

takuya@~/Desktop$ for i in {1..10} ; do echo  $( expr  1 / $i)  ;  done
1
0
0
0
0
0
0
0
0
0

小数点を扱うにはbcコマンドを使う。

bc コマンドを使う。

takuya@~/Desktop$ echo "1 + 0.1 " | bc
1.1

パイプで四則演算をbc コマンドに渡すと、小数点を含めた計算ができます。

でも、まだ使っちゃダメ。

ただ渡せばいいって話でもない。

「桁数を指定する」

慌てて使うと、以下のとおりの計算結果になってしまう。

takuya@~/Desktop$ echo "1 - 0.1 " | bc
.9
takuya@~/Desktop$ echo "1 / 0.1 " | bc
10
takuya@~/Desktop$ echo "1 / 10 " | bc
0

桁数をきっちり指定しないと、期待通りの結果が得られません。

計算結果の小数点以下桁数を指定する。

小数点以下の桁数を指定する

takuya@~/Desktop$ echo "scale=2; 1 / 10 " | bc
.10

ちょっち調べたけど、 0.1 のように 10の位を0で埋める方法は分からなかった。計算するだけなら不要、printf しろってことみたい。

bc を使う。

それでは、scale を含めて計算をしてみましょう。

takuya@~/Desktop$ for i in {1..10} ; do  echo "scale=1; 1 + $i / 10 " | bc  ;  done
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2.0