Bash は浮動小数点変数の精度を制限します。

Bash は浮動小数点変数の精度を制限します。

Ubuntu bashでは、小数点以下の桁数を014.04.1 LTS 64-bitに設定し、小数点の左側の0を削除することはできません。にどのようにbc切り替えることができますか?これは私のファイル命名規則のために必要です。ご提案いただきありがとうございます。0.005000000.005

更新:すでに定義されているシェル変数でこれを使用して再定義できますか?以下のコードではエラーが発生します。

~/Desktop/MEEP$ printf "%.3f\n" $w
bash: printf: 0.005000: invalid number
0,000

ロケール出力

@vesnog:~$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=tr_TR.UTF-8
LC_TIME=tr_TR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=tr_TR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=tr_TR.UTF-8
LC_NAME=tr_TR.UTF-8
LC_ADDRESS=tr_TR.UTF-8
LC_TELEPHONE=tr_TR.UTF-8
LC_MEASUREMENT=tr_TR.UTF-8
LC_IDENTIFICATION=tr_TR.UTF-8
LC_ALL=

出力echo $w

@vesnog:~$ echo $w
0.005000

答え1

簡単な方法は以下を使用することですprintf

$ printf "%.3f\n" 0.005000000000
0.005

先行を削除するには、0次のように解析しますsed

$ printf "%.3f\n" 0.005000000000 | sed 's/^0//'
.005

答え2

という特別な変数がありますscale。この変数を設定して精度を制限できます。

はい

$ echo "300/7" | bc -l
42.85714285714285714285

精度を制限するには、

$ echo "scale=2; 300/7" | bc -l
42.85

修正する

$ echo "scale=3; 300/7" | bc -l | sed 's/[0-9]*\././g'
.857

答え3

この sed コマンドは末尾のゼロを削除します。

sed 's/\(0\.0*[1-9][1-9]*\)0*/\1/'

で始まり、その後に0.0個以上の0'、1〜9の間の1個以上の数字、0個以上'が来る0すべての値を記憶します。次に、0個以上の末尾の項目を切り捨てます0

これにより、末尾のゼロを必要に応じて解析し、ゼロより大きいランダムな低数を維持できます。どんなに小さくても。

例えば

0.054000になったり、0.0540.00000010000000なったり0.0000001などになります。

詳しくはGrymoires Awesomeをご覧ください。sedマップ時間。

答え4

grepを使わないのはなぜですか?

echo "$your_number" | grep -o '.*[1-9]'

関連情報