bc显示小数点前的0
bc是强大而常用的计算工具。不过在除法运算时,如果得到的结果值小于1,得到的小数前面的0不存。本篇提供几个常用小数点前缺0的解决方法。
1[root@361way ~]# bc
2bc 1.06.95
3Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
4This is free software with ABSOLUTELY NO WARRANTY.
5For details type `warranty'.
6scale=2; 1/3
7.33
打开bc进入交互模式,我们键入scale=2; 1/3 回车,看到结果0.33前的0没有---注意此处保留小数点人2位 scale=2不能少,少了结果为是0 。
解决方法如下:
1#!/bin/bash
2#方法1
3res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`)
4res2=$(printf "%.2f" `echo "scale=2;5/3"|bc`)
5#方法2
6#v=$(echo $big $small | awk '{ printf "%0.2f\n" ,$1/$2}')
7v1=$(echo 1 3 | awk '{ printf "%0.2f\n" ,$1/$2}')
8v2=$(echo 5 3 | awk '{ printf "%0.2f\n" ,$1/$2}')
9#方法3
10mem1=`echo "scale=2; a=1/3; if (length(a)==scale(a)) print 0;print a "|bc`
11mem2=`echo "scale=2; a=5/3; if (length(a)==scale(a)) print 0;print a "|bc`
12echo res1 is $res1
13echo res2 is $res2
14echo v1 is $v1
15echo v2 is $v2
16echo mem1 is $mem1
17echo mem2 is $mem2
这里提供了三种方法,其中第方法1、方法3使用的bc处理,方法2使用的awk处理。执行输出结果我们看下:
1[root@361way shell]# sh bc_point_zero.sh
2res1 is 0.33
3res2 is 1.66
4v1 is 0.33
5v2 is 1.67
6mem1 is 0.33
7mem2 is 1.66
三种方法我们可以看到,方法1、方法3对小数点后面的值不会四舍五入,而方法2(awk)方法使用printf 时会对小数点(浮点运算)的值四舍五入进位。所以浮点运行时还是建议使用awk处理。不过在取整数时,awk默认也是不会四舍五入的。
1# echo 5 3 | awk '{ printf "%d\n" ,$1/$2}'
21
3# echo 5 3 | awk '{ printf "%d\n" ,$1/$2+0.5}'
42
5# echo 4 3 | awk '{ printf "%d\n" ,$1/$2+0.5}'
61
awk在取整数运算时,是需要加0.5进行进位的。
注:没有进位其实和小数点后保留的位数有关的,在小数点后的位数大于4时会自动进行进位,具体可以参考维基百科数值修约规则 。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/linux-bc-point-zero/4960.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.