bc截断浮点数

Bil*_*ain 17 linux bash bc

如何使用截断浮点数 bc

例如,如果我这样做

echo '4.2-1.3' | bc
Run Code Online (Sandbox Code Playgroud)

它输出2.9我如何截断/使用楼层来获取2

tim*_*rau 17

使用/运算符.

echo '(4.2-1.3) / 1' | bc
Run Code Online (Sandbox Code Playgroud)

  • 这似乎并不总是有效:`echo'(l(101)/ l(10))/ 1'| bc -l`返回一个浮点数. (4认同)
  • @JohnnyEverson那是因为你传递了`-l`标志来加载数学库并将`scale`设置为20。否则,默认情况下比例为零。 (3认同)

Jam*_*at7 14

如果scale为0,则除以1可以正常工作(例如,如果你开始使用bc和不更改bc scale),但如果scale是正数则失败(例如,如果你开始使用bc -l或增加bc 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
Run Code Online (Sandbox Code Playgroud)

  • 一个班轮例如:`bc <<<"scale = 10; f =(3/55); scale = 0;(312*f)/ 1"` (5认同)

Mic*_*kin 5

请尝试以下解决方案。它将截断小数点后的任何内容而不会出现问题:

echo 'x = 4.2 - 1.3; scale = 0; x / 1' | bc -l
echo 'x = l(101) / l(10); scale = 0; x / 1' | bc -l
Run Code Online (Sandbox Code Playgroud)

您可以通过直接对数字进行计算来使代码更短:

echo 'scale = 0; (4.2 - 1.3) / 1' | bc -l
echo 'scale = 0; (l(101) / l(10)) / 1' | bc -l
Run Code Online (Sandbox Code Playgroud)

通常,可以使用此函数仅获取数字的整数部分:

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);
}
Run Code Online (Sandbox Code Playgroud)

将该代码保存到文件中(我们将其称为int.bc)并运行以下命令:

echo 'int(4.2 - 1.3);' | bc -l int.bc
Run Code Online (Sandbox Code Playgroud)


小智 5

控制除法中小数位数的变量是scale

因此,如果比例为0(默认值),则除以 1 将截断为0小数:

$ echo '(4.2-1.3) / 1 ' | bc
2
Run Code Online (Sandbox Code Playgroud)

在其他运算中,小数位数是根据每个操作数的小数位数(小数位数)计算的。例如,在加法、减法和乘法中,所得的比例是两者中最大的:

$ echo ' 4.2 - 1.33333333 ' | bc
2.86666667

$ echo ' 4.2 - 1.333333333333333333 ' | bc
2.866666666666666667

$ echo ' 4.2000 * 1.33 ' | bc
5.5860
Run Code Online (Sandbox Code Playgroud)

相反,在除法中,小数位数严格等于变量的值scale

$ echo 'scale=0;4/3;scale=3;4/3;scale=10;4/3' | bc
1
1.333
1.3333333333
Run Code Online (Sandbox Code Playgroud)

由于必须恢复scale的值,所以最好定义一个函数(GNU语法):

$ echo ' define int(x){ os=scale;scale=0;x=x/1;scale=os;return(x) } 
         int( 4.2-1.3 )' | bc
2
Run Code Online (Sandbox Code Playgroud)

或者用较旧的 POSIX 语言:

$ echo ' define i(x){
             o=scale;scale=0;x=x/1;scale=o;return(x)
         } 
         i( 4.2-1.3 )' | bc
2
Run Code Online (Sandbox Code Playgroud)