bc:小数点以下の桁数を設定します


52

bc 数値を整数として扱います:

# echo "100/3" | bc
33

bc -l 数値を浮動小数点オブジェクトとして処理します。

# echo "100/3" | bc -l
33.33333333333333333333

小数点以下の桁数を制限する方法はありますか?


10
興味深いことに、これは部門でのみ機能します。あなたがやりたいならscale=0;1234*1.1、あなたはscale=0;1234*1.1/1得るようにそれを書かなければならない1357。それ以外の場合、の値に関係なくscale、を取得し1357.4ます。

@Wokのコメントは、質問ではなく、受け入れられた答えにすべきではありませんか?答えを読むまで、このコメントが何を指しているのか分かりませんでした。
ウィルソンF

1
@WilsonF回答への参照を追加しました。
アダムマタン

2
@Wok、それは除算や乗算に依存していません。それは入力に依存します-最大精度数は出力の精度を決定します。1234*1.0提供する方法に注意してください1234.0
-Richlv

回答:


70

scale特別な変数を設定します。

$ echo "scale=2; 100/3" | bc
33.33

3
質問に関する@Wokのコメントを参照してください。
アダムマタン

$ echo "scale=2; (100/180)*180" | bc与えます99.00 :(
DonatasOlsevičius16年

@DonatasOlsevičiusこれは、(100/180)= 0.55、次に(0.55 * 180)= 99であるためです。したがって、適切な値を提供しています:)
シン

上記の場合は切り上げればいいでしょう.5~$ echo "scale=2; 12/104" | bc .11 切り上げれば、これはになります.12。しかし、それでも私のタスクの仕事をするはずです。
jbrock

3
この方法で値を印刷するまで、精度を維持できますecho "result = (100/180) * 180; scale=2; result / 1" | bc -l。今あなたは得る99.99
バイロンホーキンス

11

scale除算のみに機能します。一部のオタクが乗算で必要な場合は、文字列操作を使用してこれを実現できます。あなたが乗算する必要がある場合32 * 0.60、答えはそう19.20です。答えとして19個だけを取得する必要がある場合は、さまざまな方法で取得できます。

  1. 文字列操作の使用

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    文字列操作の構文:${Variable%pattern}、これはに続く短い一致パターンを削除し%ます。文字列操作の詳細については、高度なBashスクリプトガイドを参照してください。

  2. のように使用Scaleする**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. 文字列操作の代わりに、末尾の0を取り除くために、1で除算することもできます。

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    

質問に関する私のコメントで述べたように、それは乗算ではなく、小数部分を持つ入力数値が原因であることに注意してください。または、別の言い方をすれば、「最長」の小数部分を持つ数値によって、出力の小数桁数が決まります。
-Richlv

4

以前の回答に加えて

echo "scale=2; 1.0150876" | bc

返却値

1.0150876

数学演算を追加して、2桁の10進数のみを取得-(NUMBER * 100)/ 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

今戻る

1.01

3

printfコマンドを使用して、結果を小数点以下3桁に丸めることもできます。

# printf "%.3f\n" $(echo "100/3" | bc -l)
3.333

2

四捨五入

scale = 2は回答を2桁の10進数に切り捨てますが、次のように丸めることができます。

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.