今、私は高度な配管に関連する課題を実行しています。パーセントを正常に計算しました。
echo "$ERRORS" / "$TOTAL" \* 100 | bc -l
これは正しい出力を提供します:2.64905226881102814400
ERRORS と TOTAL は整数を含む環境変数です。
しかし、完全な数字の代わりに2.649だけを出力するようにこのコマンドを変更する方法はわかりません。 bcで「scale」を使用して特定の小数点以下に縮小する方法があることを知っていますが、echo scale=3; "$ERRORS" / "$TOTAL" \* 100 | bc -l
成功しませんでした。
私は何が間違っていましたか?
答え1
努力する:
$ ERRORS=1153 TOTAL=43525
$ echo "scale = 3; $ERRORS * 100 / $TOTAL" | bc
2.649
代わりに。この場合は、スケール変数を設定scale = 3
するためにどのように入力されるかを確認してください。bc
~のbc
、これは数字の桁数です。それ除算の下数に100を掛ける方法今後部門。
これは丸めではなく切り捨てです。たとえば、8 * 100 / 9は88.889ではなく88.888になります。
シェルが浮動小数点演算(ksh93、zsh、yash)をサポートしている場合は、次のこともできます。
$ printf '%.3f\n' "$((ERRORS * 1e2 / TOTAL))"
2.649
(しかしzshとksh93では、これらの変数の内容を制御することが重要です。そうしないと、コマンドインジェクションの脆弱性が発生します。ksh93のように整数の代わりに浮動1e2
小数点100を使用します。これはaでは機能しません。10進数として使用されるロケール)。100
100.
100.
,
または、次のものを使用できますawk
。
$ awk -- 'BEGIN{printf "%.3f\n", ARGV[1] * 100 / ARGV[2]}' "$ERRORS" "$TOTAL"
2.649
9つのうち8つはどちらも88.889%(または地域によっては88,889の場合があります)を提供します。