web-dev-qa-db-ja.com

bc浮動小数点数を切り捨てます

bcを使用して浮動小数点数を切り捨てるにはどうすればよいですか。

例:

echo '4.2-1.3' | bc

2.9を出力します。フロアを切り捨て/使用して2を取得する方法

17

使用する /演算子。

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

scaleが0の場合(たとえば、bcをbcで開始し、scaleを変更しない場合)、1で除算することは問題ありませんが、scaleが0の場合は失敗します。正(たとえば、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
_
14

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

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
5
Michael Rybkin