GNU/Linux >> Linux の 問題 >  >> Linux

Bashでbcを使用して数値を丸める

次の関数は、引数 'x' を 'd' 桁に丸めます:

define r(x, d) {
    auto r, s

    if(0 > x) {
        return -r(-x, d)
    }
    r = x + 0.5*10^-d
    s = scale
    scale = d
    r = r*10/10
    scale = s  
    return r
} 

0.0005 を追加するコツ 悪い考えではありません。しかし、それはそのようにはうまくいきません。 scale bc の場合に内部的に使用されます いくつかの操作を実行します (除算など)。

あなたの場合、おそらく大きな scale を使用して、最初に除算を実行することをお勧めします または -l bc に切り替える (お使いのバージョンがサポートしている場合)、0.0005 を追加します。 scale=3 を設定します scale を含む操作を実行します

次のようなもの:

`a=$sum/$n+0.0005; scale=3; a/1`

もちろん sum 正または負です。幸い、bc いくつかの条件演算子があります。

`a=$sum/$n; if(a>0) a+=0.0005 else if (a<0) a-=0.0005; scale=3; a/1`

次に、printf を使用してこの回答をフォーマットします。 .

関数 round でラップ (オプションで小数点以下の桁数を選択できます):

round() {
    # $1 is expression to round (should be a valid bc expression)
    # $2 is number of decimal figures (optional). Defaults to three if none given
    local df=${2:-3}
    printf '%.*f\n' "$df" "$(bc -l <<< "a=$1; if(a>0) a+=5/10^($df+1) else if (a<0) a-=5/10^($df+1); scale=$df; a/1")"
}

試してみてください:

gniourf$ round "(3+3+4)/3"
3.333
gniourf$ round "(3+3+5)/3"
3.667
gniourf$ round "-(3+3+5)/3"
-3.667
gniourf$ round 0
0.000
gniourf$ round 1/3 10
0.3333333333
gniourf$ round 0.0005
0.001
gniourf$ round 0.00049
0.000

-l で スイッチ、scale 20 に設定されています 、これで十分です。


このソリューションはそれほど柔軟ではありません (float を int に変換するだけです) が、負の数を処理できます:

e=$( echo "scale=0; (${e}+0.5)/1" | bc -l )
if [[ "${e}" -lt 0 ]] ; then
    e=$(( e - 1 ))
fi

Linux
  1. Bash -cと位置パラメータ?

  2. 例を含む Bash 配列

  3. 例を含む Bash If-Else ステートメント

  1. Bashで割った数を四捨五入する

  2. bash の変数を持つエイリアス

  3. bashで複数の小数を使用して数値をソートする

  1. 行番号のない Bash 履歴

  2. bashスクリプトにスペースを含むベース名?

  3. sed で数字を 2 桁にゼロ埋めする