2016-09-06 14 views
3

Я взял две переменные в качестве входных данных и, разделив их, хочу получить результат округленным до 5 десятичных цифр. Я пробовал этот путь ->В bash как разделить две переменные и вывести ответ округленным до пяти десятичных цифр?

sum=12 
n=7 
output=$("scale=5;sum/n"|bc) 
echo $output 

Мой код не отображает никаких результатов. Что я могу сделать??

TestCase:

Если sum=3345699 и n=1000000 затем (sum/n)=3.345699, он должен быть изменен в 3.34570.

+2

'sum = 12; п = 7; Выход = $ (BC <<< "масштаб = 5; $ сумма/$ п"); echo $ output' – ymonad

ответ

2

Проблема здесь состоит в том, что вы пропустили echo (или printf или любая другая вещь), чтобы обеспечить данные для bc:

$ echo "scale=5; 12/7" | bc 
1.71428 

Кроме того, как отметил cnicutar в комментариях, вы должны использовать $ для обозначения переменных. sum - строка, $sum - значение переменной sum.
Все вместе, ваш фрагмент кода должен быть как:

sum=12 
n=7 
output=$(echo "scale=5;$sum/$n" | bc) 
echo "$output" 

Это возвращает 1.71428.

В противном случае, с "scale=5;sum/n"|bc вы просто обжигающе задание и делает bc неудачу:

$ "scale=5;sum/n"|bc 
bash: scale=5;sum/n: No such file or directory 

Вы тогда говорите, что вы хотите, чтобы результат закруглены, что не происходит прямо сейчас:

$ sum=3345699 
$ n=1000000 
$ echo "scale=5;($sum/$n)" | bc 
3.34569 

Для этого нужен другой подход, поскольку bc не круглый. Вы можете использовать printf вместе с %.Xf округлить до X десятичных чисел, что и делает:

$ printf "%.5f" "$(echo "scale=10;$sum/$n" | bc)" 
3.34570 

Смотреть Я даю большой масштаб, так что тогда printf имеет номера десятичные достаточно, чтобы округлить правильно.

+1

Вам не нужно говорить '$ sum/$ n'? – cnicutar

+0

@cnicutar абсолютно. Спасибо, исправлено! – fedorqui

+0

@ jbsu32 Какие значения вы даете 'sum' и' n' для получения '(sum/n) = 3.345699'? – fedorqui

0
awk 'BEGIN{sum=12;n=7;printf "%0.5f\n", sum/n}' 
1.71429 

В этом решении awk использует printf для округления десятичных чисел до 5 мест. Если вы хотите передать Баш переменные, то используйте следующее:

awk -v sum=12 -v n=7 'BEGIN{printf "%0.5f\n", sum/n}' 
1.71429 

На стороне записки, AWK, кажется, хорошо в арифметике:

sh-4.1$ time echo "scale=5; 12/7" | bc ; time echo "scale=5;($sum/$n)"|bc;time awk 'BEGIN{sum=12;n=7;printf "%0.5f\n", sum/n}' 
1.71428 

real 0m0.004s 
user 0m0.001s 
sys  0m0.002s 
1.71428 

real 0m0.004s 
user 0m0.001s 
sys  0m0.001s 
1.71429 

real 0m0.002s 
user 0m0.001s 
sys  0m0.000s 
sh-4.1$ 
1

sum и n, это переменные bash. вы должны добавить $, чтобы получить их значения. Таким образом, решение должно быть:

echo "scale=5;($sum/$n)"|bc 
1.71428 

 Смежные вопросы

  • Нет связанных вопросов^_^