shell编写时对浮点的处理

Bash中的变量没有数据类型的定义,所以在处理字符串和数值时会带来麻烦。
例如:
          使用-eq比较数值,=比较字符串等;
          常用的let、expr仅支持整数运算,不支持浮点数计算。要实现浮点数计算,可以使用bc或awk。

一、bc 

shell bc支持浮点数,是一个用于数学运算的高级工具。

[root@localhost 桌面]# bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
2+3         回车
5
3.5*2.3    回车
8.0
Ctrl+d 退出

当然bc还支持很多运算符,比如/ * - +。还支持变量,条件比较操作符,逻辑操作符,判断语句和循环语句

a=1
while(a++<100)
sum+=a
sum
5049

1.设定小数精度,使用参数scale。

[root@localhost ]# echo "scale=5;3/21" | bc
.14285
[root@localhost ]# echo "scale=2;3/21" | bc
.14

2.进制转换,使用参数obase,ibase(表示输出,输入采用什么进制)

[root@localhost ]# william=100;echo "obase=2;$william" | bc
1100100
[root@localhost ]# william=100;echo "obase=10;ibase=2;$william" | bc
4
[root@localhost ]# william=100;echo "obase=10;ibase=5;$william" | bc
25

3.计算平方和平方根

[root@localhost ]# echo "sqrt(100)" | bc
10
[root@localhost ]# echo "10^10" | bc
10000000000

4.浮点数比较

Ver1="1.01"
Ver2="1.02"
if [ `echo "${Ver1}==${Ver2}"|bc` -eq 1 ] ; then
echo -e "v1 == v2\n"
fi
echo "$Ver1 > $Ver2"|bc


0

 

 


二、awk

更好的方法,是借助awk强大的函数功能
 

1、计算浮点数

 n=`awk -v x=2.53 -v y=3.64 'BEGIN {printf "%.2f\n",x/y}'`
echo $n
0.70

n=`awk 'BEGIN {x=2.53;y=3.64;printf "%.2f\n",x/y}'`
echo $n
0.70

echo '2.53 3.64'|awk '{printf "%.2f\n",$1/$2}'
0.70

2、比较浮点数

 echo 123.45 123.44 | awk '{if($1>$2) {printf"%f greater then %f\n",$1,$2} else {printf"%f less then %f\n",$1,$2}}'
123.450000 greater then 123.440000

Ver2="1.02"
Ver1="1.01"
echo ${Ver1} ${Ver2} |awk '{if($1>$2){printf("1")}else {printf("0")}}'
if [ `echo ${Ver1} ${Ver2} |awk '{if($1==$2){printf("1")}else {printf("0")}}'` -eq 1 ] ; then
echo -e "v1 == v2 a\n"
fi

0


三、其他方法

还可以用支持浮点预算的语言,如perl或python等,放在Bash脚本中运行:

perl -e 'if ($ARGV[0]>$ARGV[1]) { printf "%f greater then %f\n",$ARGV[0],$ARGV[1];} else { printf "%f less then %f\n",$ARGV[0],$ARGV[1];}' 123.45 123.44
123.450000 greater then 123.440000


 

四、参考文献:

在此感谢原创提供的文献

https://blog.csdn.net/stormbjm/article/details/19128023

https://www.xuebuyuan.com/3210111.html

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值