shell中用bc进行浮点运算

shell中用bc进行浮点运算Bash 不能处理浮点运算 并且缺乏特定的一些操作 这些操作都是一些重要的计算功能 幸运的是 nbsp bc nbsp nbsp 可以解决这个问题 nbsp bc nbsp 不仅仅是个多功能灵活的精确的工具 而且它还提供许多编程语言才具备的一些方便的功能 nbsp nbsp nbsp 因为它是一个完整的 UNIX 工具 所以它可以用在 nbsp 管道 nbsp 中 nbsp nbsp bc nbsp nbsp 在脚本中也是很常用的 nbsp 这里有一个简单的使用 bc 命令的模版可以用来在计算脚本中的变量

Bash 不能处理浮点运算, 并且缺乏特定的一些操作,这些操作都是一些重要的计算功能.幸运的是, bc  可以解决这个问题. bc 不仅仅是个多功能灵活的精确的工具, 而且它还提供许多编程语言才具备的一些方便的功能.   因为它是一个完整的 UNIX 工具, 所以它可以用在 管道 中,  bc  在脚本中也是很常用的.

 

这里有一个简单的使用 bc 命令的模版可以用来在计算脚本中的变量. 用在命令替换 中.

variable=$(echo “OPTIONS; OPERATIONS” | bc) 

如:interest_rate=$(echo “scale=9; $interest_r/12 + 1.0” | bc)

 以前一直以为bc做了不了浮点运算,虽然他能结算类似
13.4*45.6
的乘法,但是在计算除法的时候,无论你输入
5/3
还是
5/3.0
得到的结果都是
1

我也没有去看man手册,今天无意中发现了ibase这个变量,是bc使用的一个变量,表示输入的数字的进制,比如ibase=8,表示你输入的数是8进制的。
这让我很好奇,于是去看了man手册,原来他是可以做浮点除法的,只是默认不输出小数点后面的值,它同样采用了一个变量来控制--scale,其值表示输出多少位小数。另外一个和ibase对应的变量是obase,表示结果输出采用什么进制,默认是10进制。 
给出几个例子,大家一看就明白了。












1. 用bc来处理计算(包括整型和浮点计算)



bc – An arbitrary precision calculator language
(1). 通常在Bash脚本中使用bc的范例格式为:
variable=$(echo “OPTIONS; OPERATIONS” | bc [options]) 即:echo “[选项];操作” | bc [选项]
(2). 在下面的脚本中,提到在第一个选项中,“scale”变量表示输出中小数点后的精度,可以用于控制计算结果的精度;“ibase”和“obase”分别表示输入和输出数据的进制,可以用于数值进制的转换。
(3). 浮点数的比较,如“if [ $(echo “$big > $small” | bc) -eq 1 ]”,将一个逻辑判断式用管道传给bc。如果结果为真则输出1,否则输出0,然后就可以利用这个结果进行进一步的操作了。
(4). bc本来是用一个文件作为输入进行计算的(后面也有演示),所以可以将很复杂的计算写到文件中,然后让bc工具去处理到处计算结果。
注意一下:在使用除法运算符/时,要想保留小数,需要自己设置scale,否则默认时scale,小数点后时0位。

2. 使用awk来处理浮点计算和浮点数比较







复制代码代码如下:

#!/bin/bash
# author: Jay


# some examples for playing with floating point number.

# basic usage of ‘bc’ tool in Bash.
a=3.33
b=3.3
c=$(echo “$a + $b” | bc)
d=$(echo “$a * $b” | bc)
e=$(echo “scale=5; $a / $b” | bc)
echo “c=a+b=$a+$b=$c”
echo “d=a*b=$a*$b=$d”
echo “e=a/b=$a/$b=$e”

# “-l” parameter for ‘bc’ means using math library.
pi=$(echo “scale=10; 4*a(1)” | bc -l)
s=$(echo “s($pi/6)” | bc -l)
echo “pi=$pi”
echo “s=sin(pi/6)=$s”

# use more options of ‘bc’ tool
r=$(echo ‘ibase=10;obase=2; 15+16’ | bc)
echo “binary of (15+16) is $r”

# comparison for floating point numbers using ‘bc’
big=100
small=99.9
if [ $(echo “$big > $small” | bc) -eq 1 ]; then
        echo “$big is bigger than $small”
fi

# deal with floating point numbers with ‘awk’ language
echo $(awk -v x=10 -v y=2.5 ‘BEGIN {printf “10/2.5=%.2f\n”,x/y}’)
v=$(echo $big $small | awk ‘{ printf “%0.8f\n” ,$1/$2}’)
echo “$big / $small = $v”

echo $big $small | awk ‘{if($1>$2) {printf”%f > %f\n”,$1,$2} else {printf”%f <%f\n",$1,$2}}'





































复制代码代码如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.sh
c=a+b=3.33+3.3=6.63
d=a*b=3.33*3.3=10.98
e=a/b=3.33/3.3=1.00909
pi=3.
s=sin(pi/6)=.
binary of (15+16) is 11111
100 is bigger than 99.9
10/2.5=4.00
100 / 99.9 = 1.00
100.000000 > 99.











另外,bc处理一个文件中的计算逻辑,演示如下:

复制代码代码如下:

master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc
3+8
3/8
scale=2; 3/8

master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc
11
0
.37









bc是强大的工具,请“man bc”查看详情;同样,请“man awk”。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208331.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:50
下一篇 2026年3月19日 上午11:50


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号