web-dev-qa-db-fra.com

Arrondir les nombres à virgule flottante bash

Ok, j'essaie donc d'arrondir une entrée de 17.92857, pour qu'elle reçoive une entrée de 17.929 dans bash.

Mon code jusqu'ici est:

read input
echo "scale = 3; $input" | bc -l

Cependant, lorsque j'utilise ceci, il n'est pas arrondi, il retourne 17.928.

Est-ce que quelqu'un connaît des solutions à cela?

16
Quill

Si input contient un nombre, une commande externe telle que bc n'est pas nécessaire. Vous pouvez simplement utiliser printf:

printf "%.3f\n" "$input"

Edit: Si l'entrée est une formule, vous devez cependant utiliser bc comme dans l'une des commandes suivantes:

printf "%.3f\n" $(bc -l <<< "$input")
printf "%.3f\n" $(echo "$input" | bc -l)
21
Tim Zimmermann

Une petite astuce consiste à ajouter 0.0005 à votre saisie afin que votre numéro soit arrondi correctement.

1
Ludovic Feltz

Vous pouvez écrire une fonction d'assistance Shell round ${FLOAT} ${PRECISION} pour cela:

#!/usr/bin/env bash

round() {
  printf "%.${2}f" "${1}"
}

PI=3.14159

round ${PI} 0
echo
round ${PI} 1
echo
round ${PI} 2
echo
round ${PI} 3
echo
round ${PI} 4
echo
round ${PI} 5
echo
round ${PI} 6
echo

# Outputs:
3
3.1
3.14
3.142
3.1416
3.14159
3.141590

# To store in a variable:
ROUND_PI=$(round ${PI} 3)
echo ${ROUND_PI}

# Outputs:
3.142
1
Zane Hooper