Округление чисел с плавающей запятой bash

хорошо, поэтому я пытаюсь округлить вход 17.92857, Так что он получает на вход 17.929 в bash.

мой код до сих пор:

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

однако, когда я использую это, он не округляется, он возвращает 17.928.

кто-нибудь знает какие-либо решения для этого?

4 ответов


в случае input содержит число, нет необходимости во внешней команде, такой как bc. Вы можете просто использовать printf:

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

Edit: в случае, если вход является формулой, вы должны использовать bc как в одной из следующих команд:

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

маленький трюк, чтобы добавить 0.0005 на ваш вход, таким образом, вы будете иметь свой номер округлить правильно.


Вы можете написать вспомогательную функцию оболочки round ${FLOAT} ${PRECISION} для этого:

#!/usr/bin/env bash

round() {
  printf "%.f" ""
}

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

Если вы получаете ошибку округления с номером 17.928, попробуйте это: читать г v=echo "scale = 3; $y" |bc -l если [ $v == 17.928 ]; то Эхо " 17.929" еще echo $v фи