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

bc 浮動小数点数の切り捨て

/ を使用

echo '(4.2-1.3) / 1' | bc

次の解決策を試してください。小数点以下は問題なく切り捨てられます:

echo 'x = 4.2 - 1.3; scale = 0; x / 1' | bc -l
echo 'x = l(101) / l(10); scale = 0; x / 1' | bc -l

数値に対して直接計算を実行することで、コードを少し短くすることができます:

echo 'scale = 0; (4.2 - 1.3) / 1' | bc -l
echo 'scale = 0; (l(101) / l(10)) / 1' | bc -l

通常、この関数を使用して数値の整数部分のみを取得できます:

define int(x) {
    auto s;
    s = scale;
    scale = 0;
    x /= 1; /* This will have the effect of truncating x to its integer value */
    scale = s;
    return (x);
}

そのコードをファイルに保存します (名前を int.bc にしましょう) )、次のコマンドを実行します:

echo 'int(4.2 - 1.3);' | bc -l int.bc

scale の場合、1 で割っても問題ありません 0 です (たとえば、bc を bc で開始した場合) scale を変更しないでください ) ただし、scale の場合は失敗します 正 (例:bc を bc -l で開始する場合) または scale を増やします )。 (以下のトランスクリプトを参照してください。) 一般的な解決策として、trunc を使用します。 次のように機能します。
define trunc(x) { auto s; s=scale; scale=0; x=x/1; scale=s; return x }

bc -l で 1 による除算が単独で失敗する方法を示すトランスクリプト 場合、しかしどのように trunc 関数はゼロに向かって切り捨てられても問題なく動作します:

> bc -l
bc 1.06.95
[etc...]
for (x=-4; x<4; x+=l(2)) { print x,"\t",x/1,"\n"}
-4  -4.00000000000000000000
-3.30685281944005469059 -3.30685281944005469059
-2.61370563888010938118 -2.61370563888010938118
-1.92055845832016407177 -1.92055845832016407177
-1.22741127776021876236 -1.22741127776021876236
-.53426409720027345295  -.53426409720027345295
.15888308335967185646   .15888308335967185646
.85203026391961716587   .85203026391961716587
1.54517744447956247528  1.54517744447956247528
2.23832462503950778469  2.23832462503950778469
2.93147180559945309410  2.93147180559945309410
3.62461898615939840351  3.62461898615939840351
define trunc(x) { auto s; s=scale; scale=0; x=x/1; scale=s; return x }
for (x=-4; x<4; x+=l(2)) { print x,"\t",trunc(x),"\n"}
-4  -4
-3.30685281944005469059 -3
-2.61370563888010938118 -2
-1.92055845832016407177 -1
-1.22741127776021876236 -1
-.53426409720027345295  0
.15888308335967185646   0
.85203026391961716587   0
1.54517744447956247528  1
2.23832462503950778469  2
2.93147180559945309410  2
3.62461898615939840351  3

Linux
  1. 特定の文字列を含むファイルの数は?

  2. Bashでビルド番号を増やしますか?

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

  1. アセンブリNASMで数値を出力するには?

  2. ファイルを行単位で切り詰めるには?

  3. 確立された TCP 接続の数を取得する

  1. Lsによって出力される行数?

  2. 支払いまでの日数を計算しますか?

  3. stat コマンド出力のデバイス番号