web-dev-qa-db-ja.com

float値をbcでintに丸めるまたは変換する方法は?取得: "(standard_in)1:構文エラー"

2743410360.320のような値を取得し、変数に2743410360のような値を取得します。

私は試した

INTValueOfGB=$ echo "($gb+0.5)/1" | bc

しかし、私は(standard_in) 1: syntax error

3
vin

丸めにはprintfを使用できます。

$ printf "%.0f" 2743410360.320
5
dchirikov
$ p=2743410360.320
$ echo $p
2743410360.320
$ echo ${p%%.*}
2743410360
3
michas

@vinの問題に対する答えが見つかりません。

しかし(standard_in) 1: syntax errorを取得しています

シェル変数bcが設定されていないため、gbコマンドは(standard_in) 1: syntax errorを出力します。

$ unset gb
$ echo "($gb+0.5)/1" | bc
(standard_in) 1: syntax error

$ gb=2743410360.320
$ echo "($gb+0.5)/1" | bc
2743410360

@dchirikovの回答へのコメントで、@ vinはprintf "%.0f"が「機能していない」と言っています:

$ unset gb
$ printf '%.0f\n' $gb
0

$ gb=2743410360.320
$ printf '%.0f\n' $gb
2743410360

@vinに問題がある両方の領域で、変数の設定を解除すると問題が再現し、変数を設定すると問題が解決します。

2
RobertL

コマンドにはいくつかの( )が必要です:

INTValueOfGB=$( echo "($gb+0.5)/1" | bc )

しかし、それは数値を丸めません。そのためには、スケールを0に設定する必要があります。

INTValueOfGB=$( echo "scale=0;($gb+0.5)/1" | bc )

(x.5から)次の整数に切り上げられます。

「次の偶数への丸め」(バンカーの規則)を取得するには、printf丸めを使用する必要があります。

LC_NUMERIC=C printf "%.0f" 2743410360.320

LC_NUMERICは、数値がドットとして10進数として処理されるようにします。それはドイツのユーザーが使用することを好むものではありません、これは,を使用して小数で動作するはずです:

$ LC_NUMERIC=de_DE.utf8 printf "%.0f" 2743410360,320
2743410360
0
user79743