2017-06-22 78 views
0

我用下面的行腳本在我的shell代碼 百分率爲echo "scale=2; $DP*100/$SDC" | bc 返回0.16作爲輸出,但我需要它作爲使用bc 0.16 POSIX兼容的如何計算在shell腳本個

+1

已答覆在這裏:https://stackoverflow.com/questions/8402181/how-do-i-get-bc1-to-print-the-leading-zero – periket2000

回答

0

解決方案:

#!/bin/sh 
Percent="$(echo " 
    scale=2; 
    a = $DP * 100/$SDC; 
    if (a > -1 && a < 0) { print "'"-0"'"; a*=-1; } 
    else if (a < 1 && a > 0) print 0; 
    a" | bc)" 

當答案在-1和1(獨佔)之間但不爲零時,這種情況下所有這些特殊檢查都很難看。

讓我們使用awk改用這個POSIX兼容的解決方案:

#!/bin/sh 
Percent="$(echo "$DP" "$SDC" |awk '{printf "%.2f", $1 * 100/$2}')" 

的Z shell可本地執行此操作:

#!/bin/zsh 
Percent="$(printf %.2f $((DP * 100./SDC)))" 

(該點是必要的指導zsh中使用浮點運算。 )

使用字符串操作的原生POSIX解決方案(假設整數輸入 ):

#!/bin/sh 
#         # e.g. round down e.g. round up 
#         # DP=1 SDC=3  DP=2 SDC=3 
Percent=$((DP * 100000/SDC + 5)) # Percent=33338  Percent=66671 
Whole=${Percent%???}     # Whole=33   Whole=66 
Percent=${Percent#$Whole}   # Percent=338  Percent=671 
Percent=$Whole.${Percent%?}   # Percent=33.33  Percent=66.67 

此計算1000倍所需的答案,使我們擁有我們所需要的最終解決方案的百分之一的數據。它增加了五個,所以我們可以正確截斷千分位數。然後,我們將臨時變量$Whole定義爲截斷的整數值,我們暫時將其從$Percent中除去,然後我們附加一個小數點和小數點,排除千分之一(我們犯了錯誤,因此我們可以正確舍入百分之一)。