/
を使用
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