51 votes

Comment arrondir les décimales en utilisant bc dans bash ?

Un exemple rapide de ce que je veux en utilisant un script bash :

#!/bin/bash
echo "Insérez le prix que vous souhaitez calculer :"
read float
echo "Voici le prix sans taxes :"
echo "scale=2; $float/1.18" |bc -l
read -p "Appuyez sur une touche pour continuer..."
bash scriptname.sh

En supposant que le prix est 48.86 La réponse sera : 41.406779661 (41.40 en réalité car j'utilise scale=2;)

Ma question est : Comment arrondir le deuxième décimal pour afficher la réponse de cette manière : 41.41

36voto

Mike2012 Points 123

La solution la plus simple :

printf %.2f $(echo "$float/1.18" | bc -l)

34voto

user85321 Points 1287

Une fonction bash de ronde:

round()
{
echo $(printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
};

Utilisé dans votre exemple de code:

#!/bin/bash
# la fonction "round()" a été prise sur 
# http://stempell.com/2009/08/rechnen-in-bash/

# la fonction de ronde:
round()
{
echo $(printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
};

echo "Insérez le prix que vous voulez calculer:"
read float
echo "Voici le prix sans taxes:"
#echo "scale=2; $float/1.18" |bc -l
echo $(round $float/1.18 2);
read -p "Appuyez sur une touche pour continuer..."

Bonne chance :o)

22voto

zuberuber Points 2012

Arrondi avec Bash/awk :

echo "23.49" | awk '{printf("%d\n",$1 + 0.5)}'  

Si vous avez python vous pouvez utiliser quelque chose comme ceci :

echo "4.678923" | python -c "print round(float(raw_input()))"

8voto

Voici une solution purement bc. Règles d'arrondi : à +/- 0,5, arrondir à l'éloignement de zéro.

Placez l'échelle que vous recherchez dans $result_scale; votre calcul doit se trouver à l'emplacement $MATH dans la liste de commandes bc :

bc < 0) h=0.5

a=(m * t + h)

scale=$result_scale
a / t
MATH

4voto

KCampbell Points 1

Voici une version abrégée de votre script, corrigée pour fournir la sortie que vous souhaitez:

#!/bin/bash
float=48.86
echo "Vous avez demandé $float; C'est le prix sans taxes:"
echo "scale=3; price=$float/1.18 +.005; scale=2; price/1 " | bc

Notez que l'arrondi à l'entier le plus proche équivaut à ajouter .5 et prendre le plancher, ou arrondir vers le bas (pour les nombres positifs).

De plus, le facteur d'échelle est appliqué au moment de l'opération; donc (ce sont des commandes bc, vous pouvez les coller dans votre terminal):

float=48.86; rate=1.18; 
scale=2; p2=float/rate
scale=3; p3=float/rate
scale=4; p4=float/rate
print "Comparaison:  ",p2, " v ", p3, " v ", p4
Comparaison:  41.40 v 41.406 v 41.4067

# cependant, l'échelle n'affecte pas une valeur entrée (ni une addition)
scale=0
a=.005
9/10
0
9/10+a
.005

# essayons d'arrondir
scale=2
p2+a
41.405
p3+a
41.411
(p2+a)/1
41.40
(p3+a)/1
41.41

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X