linux shell中小数的运算

对于在Shell中进行小数数字的计算,其实方法有很多,但是常用的方法都有其弱点:

1、bc

    bc应该是最常用的Linux中计算器了,简单方便,支持浮点。

root@localhost:~# echo 1+2 | bc

3

root@localhost:~# echo 5.2*2.1 |bc

10.9

root@localhost:~# echo 5/3

5/3

root@localhost:~# echo 5/3 |bc

1

root@localhost:~# echo "scale=2;5/3" |bc

1.66

root@localhost:~# echo "scale=3;2/3" | bc

.666

    从上面可以看到开始一切顺利,但是在计算小于1的小数的时候,最前面的0是不显示的,如0.666显示为.666,这个有些郁闷,还是没有达到完美的解决方法。

2、expr

    不支持浮点计算,即不支持小数,所以也常被用来判断变量内容或者结果是不是非0整数(expr 0的echo $?不是0)。这里就不详细赘述了

3、$(())

同 expr

4、let

    不仅不支持浮点计算,而且还只能赋值,不能直接输出。

5、awk

    这里,我使用的是awk计算:

root@localhost:~# echo | awk '{print 12/21}'

0.571429

看上去还可以,那么进一步,我需要带变量:

root@localhost:~# a=5

root@localhost:~# b=11

root@localhost:~# c=21

root@localhost:~# echo | awk '{print $a/$b}'

nan

root@localhost:~# echo | awk "{print $a/$b}"

0.454545

    看上去也还可以,只是注意当使用变量的时候awk后的单引号需要变为双引号。

扫描二维码关注公众号,回复: 13473053 查看本文章

那么如何控制 显示的小数位数呢?没有找到print控制小数位数的方法,那么是否可以利用printf呢?

echo | awk '{printf "%.2f\n",10/3}'

3.33

这样是可以的,在继续试验变量的计算

root@localhost:~# a=5

root@localhost:~# b=11

root@localhost:~# c=21

echo | awk "{printf "%.3f\n",$a/$b}"

awk: line 1: syntax error at or near %

root@localhost:~# echo | awk '{printf "%.3f\n",$a/$b}'

nan

一直报错,那么将变量打印出来

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",$a/$b}'

1.000

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",$b/$a}'

1.000

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",10/$a}'

2.000

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",12/$a}'

2.400

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",$a/3}'

1.667

可以看到打印出来后,可以使用一个变量,如何使用多个变量呢

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",$a/$b}'

1.000

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",$1/$2}'

0.455

root@localhost:~# echo "$a $b $c" | awk '{printf "%.3f\n",$2/$3}'

0.524

这样就可以了,可以使用$1,2,3,…来代替数字。也算是一种方法吧。

猜你喜欢

转载自blog.csdn.net/mainmaster/article/details/120649127