Shell-Script
如何讓 bc 列印尾隨零?
我閱讀了有關如何讓 bc 列印第一個零的主題,但這並不是我想要的。我想要更多…
我想要一個返回帶有八位十進制數字的浮點數的函式。我對任何解決方案持開放態度,使用 awk 或任何公平的方法。一個例子將說明我的意思:
hypothenuse () { local a=${1} local b=${2} echo "This is a ${a} and b ${b}" local x=`echo "scale=8; $a^2" | bc -l` local y=`echo "scale=8; $b^2" | bc -l` echo "This is x ${x} and y ${y}" # local sum=`awk -v k=$x -v k=$y 'BEGIN {print (k + l)}'` # echo "This is sum ${sum}" local c=`echo "scale=8; sqrt($a^2 + $b^2)" | bc -l` echo "This is c ${c}" }
有時,
a
並且b
是0.00000000
,我需要在c
返回時保留所有這些 0。目前,當發生這種情況時,此程式碼會返回以下輸出:This is a 0.00000000 and b 0.00000000 This is x 0 and y 0 This is c 0
我希望它列印出來
This is a 0.00000000 and b 0.00000000 This is x 0.00000000 and y 0.00000000 This is c 0.00000000
幫助將不勝感激!
您可以通過這種方式外部化格式,使用
printf
:printf "%0.8f" ${x}
例子:
x=3 printf "%0.8f\n" ${x} 3.00000000
注意:
printf
輸出取決於您的語言環境設置。
在 bc 中,解決方案是除以 1:
$ bc -l <<<"scale=8; x=25*20; x" 500 $ bc -l <<<"scale=8; x=25*20; x/1" 500.00000000
所以,你的腳本可能是這樣的:
hypothenuse () { local a b c x y a=${1}; b=${2} echo "This is a ${a} and b ${b}" x=$(echo "scale=8; $a^2/1" | bc -l) y=$(echo "scale=8; $b^2/1" | bc -l) echo "This is x ${x} and y ${y}" # local sum=`awk -v k=$x -v k=$y 'BEGIN {print (k + l)}'` # echo "This is sum ${sum}" c=$(echo "scale=8; sqrt($a^2 + $b^2)/1" | bc -l) echo "This is c ${c}" }
我強烈建議您使用
$(…)
而不是…
.但即使這樣也失敗了,值為 0。
最好的解決方案是讓 bc 的比例為 20(來自 bc -l),在一次呼叫 bc 時完成所有需要的數學運算,然後根據需要使用
printf
. 是printf
的可以格式化浮點數。假設 bash
hypothenuse () { local a b c x y a=${1:-0} b=${2:-0} read -d '' x y c < <( bc -l <<<"a=$a; b=$b; x=a^2; y=b^2; c=sqrt(x+y); x;y;c" ) printf 'This is a %14.8f and b %14.8f\n' "$a" "$b" printf 'This is x %14.8f and y %14.8f\n' "$x" "$y" printf 'This is c %14.8f \n' "$c" }