2017-03-22 4 views
0

J'essaie d'implémenter le calcul suivant dans un script Bash en utilisant "bc" mais l'option "scale" produit un résultat incorrect avec 2 zéros supplémentaires à la fin, ce qui signifie que je Je dois le couper manuellement (moche).calcul mathématique bash et bc avec virgule décimale

Calcul:

((2592000-239) ÷ 2592000) × 100

Résultat attendu: 99,990779321 (Mais je voudrais montrer que 2 décimales)

Dans Bash:

echo "scale=2; ((2592000-239)/2592000)*100" | bc 

99.00 

echo "scale=3; ((2592000-239)/2592000)*100" | bc 

99.900 

echo "scale=4; ((2592000-239)/2592000)*100" | bc 

99.9900 

echo "scale=5; ((2592000-239)/2592000)*100" | bc 

99.99000 

echo "scale=8; ((2592000-239)/2592000)*100" | bc 

echo "scale=8; ((2592000-239)/2592000)*100" | bc 

99.99077900 

echo "scale=10; ((2592000-239)/2592000)*100" | bc 

99.9907793200 

Selon la page de manuel:

NUMÉROS L'élément le plus fondamental dans bc est le nombre. Les nombres sont des nombres de précision arbitraires. Cette précision est à la fois dans la partie entière et la partie fractionnaire. Tous les nombres sont représentés en en décimal et tout le calcul est fait en décimal. (Cette version tronque les résultats des opérations de division et de multiplication.) Il existe deux attributs de nombres, la longueur et l'échelle. La longueur est le nombre total de chiffres décimaux significatifs dans un nombre et l'échelle est le nombre total de chiffres décimaux après le point décimal. Par exemple: 0,000001 a une longueur de 6 et à l'échelle de 6. 1935,000 a une longueur de 7 et une échelle de 3.

Suis-je bien compris?

Répondre

2

Vous pouvez utiliser:

echo 'scale=2; 100*(2592000-239)/2592000' | bc -l 

99.99 

Vous obtenez 99.00 parce que vous êtes en divisant la première qui obtient .99 et quand il est multiplié par 100 il devient 99.00 (en raison de scale-2)

+1

Génial merci, cela a du sens – Arturski

2

Si vous ne veulent pas vérifier vos bc instructions pour l'ordre math-opérations correctes, (l'échelle est appliquée pour la division) laissez simplement calculer bc en utilisant la précision par défaut un format la sortie en bash, comme:

printf "%.2f\n" $(bc -l <<< '((2592000-239)/2592000)*100') 
# 99.99