2017-06-22 8 views

答えて

0

POSIX準拠のソリューションはbcを使用して、それを必要とする:

#!/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シェルはネイティブでこれを行うことができます:

#!/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回必要な答えを計算します。それは5を足して、1000番目の数字を適切に切り捨てることができます。次に、一時変数$Wholeを切り捨て整数値として定義し、一時的にその値を$Percentから取り除き、1000分の1を除いてドットと小数点を追加します(正しく設定して100分の1に丸めることができます)。

関連する問題