Округление чисел с плавающей точкой bash
Итак, я пытаюсь округлить ввод 17.92857
, так что он получает вход 17.929
в bash.
Мой код до сих пор:
read input
echo "scale = 3; $input" | bc -l
Однако, когда я использую это, он не округляется, он возвращает 17.928
.
Кто-нибудь знает какие-либо решения?
Ответы
Ответ 1
В случае, если input
содержит число, нет необходимости в внешней команде, такой как bc
. Вы можете просто использовать printf
:
printf "%.3f\n" "$input"
Изменить: Если вход является формулой, вы должны использовать bc
как в одной из следующих команд:
printf "%.3f\n" $(bc -l <<< "$input")
printf "%.3f\n" $(echo "$input" | bc -l)
Ответ 2
Небольшой трюк состоит в том, чтобы добавить 0.0005
к вашему входу, таким образом, вы правильно проведете свой номер.
Ответ 3
Вы можете написать вспомогательную функцию оболочки round ${FLOAT} ${PRECISION}
для этого:
#!/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
Ответ 4
если вы получаете ошибку округления с номером 17.928, попробуйте следующее:
готов
v = echo "scale = 3; $y" |bc -l
если [$ v == 17.928]; тогда эхо "17.929"
еще echo $v
ц