bc顯示小數點前的0

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

相關文章
相關標籤/搜索