bc是强大而经常使用的计算工具。不过在除法运算时,若是获得的结果值小于1,获得的小数前面的0不存。本篇提供几个经常使用小数点前缺0的解决方法。bash
1 [root@maqing ~]# bc 2 bc 1.06.95 3 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 4 This is free software with ABSOLUTELY NO WARRANTY. 5 For details type `warranty'. 6 scale=2; 1/3 7 .33
打开bc进入交互模式,咱们键入scale=2; 1/3 回车,看到结果0.33前的0没有---注意此处保留小数点人2位 scale=2不能少,少告终果为是0 。工具
解决方法以下:spa
1 #!/bin/bash 2 #方法1 3 res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`) 4 res2=$(printf "%.2f" `echo "scale=2;5/3"|bc`) 5 #方法2 6 #v=$(echo $big $small | awk '{ printf "%0.2f\n" ,$1/$2}') 7 v1=$(echo 1 3 | awk '{ printf "%0.2f\n" ,$1/$2}') 8 v2=$(echo 5 3 | awk '{ printf "%0.2f\n" ,$1/$2}') 9 #方法3 10 mem1=`echo "scale=2; a=1/3; if (length(a)==scale(a)) print 0;print a "|bc` 11 mem2=`echo "scale=2; a=5/3; if (length(a)==scale(a)) print 0;print a "|bc` 12 echo res1 is $res1 13 echo res2 is $res2 14 echo v1 is $v1 15 echo v2 is $v2 16 echo mem1 is $mem1 17 echo mem2 is $mem2
这里提供了三种方法,其中第方法一、方法3使用的bc处理,方法2使用的awk处理。执行输出结果咱们看下:code
1 [root@maqing]# sh bc_point_zero.sh 2 res1 is 0.33 3 res2 is 1.66 4 v1 is 0.33 5 v2 is 1.67 6 mem1 is 0.33 7 mem2 is 1.66
三种方法咱们能够看到,方法一、方法3对小数点后面的值不会四舍五入,而方法2(awk)方法使用printf 时会对小数点(浮点运算)的值四舍五入进位。因此浮点运行时仍是建议使用awk处理。不过在取整数时,awk默认也是不会四舍五入的。blog
1 # echo 5 3 | awk '{ printf "%d\n" ,$1/$2}' 2 1 3 # echo 5 3 | awk '{ printf "%d\n" ,$1/$2+0.5}' 4 2 5 # echo 4 3 | awk '{ printf "%d\n" ,$1/$2+0.5}' 6 1
awk在取整数运算时,是须要加0.5进行进位的。ip
注:没有进位其实和小数点后保留的位数有关的,在小数点后的位数大于4时会自动进行进位,具体能够参考维基百科数值修约规则 。get