Shell-Script

如何讓 bc 列印尾隨零?

  • January 8, 2020

我閱讀了有關如何讓 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並且b0.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"
              }

引用自:https://unix.stackexchange.com/questions/560871