2014-01-11 2 views
0

мне нужно сделать некоторые основные математические (720/304) * 360Bash: Как рассчитать?

но Баш действует очень странно:

echo "720/304 * 360" | bc 
720 

echo "(720/304) * 360" | bc 
720 

echo $(((720/304) * 360)) 
720 
+0

Баша можно сделать только целочисленную арифметику. –

ответ

2

Использование bc -l получить нецелых результаты каждой операции.

echo "720/304 * 360" | bc -l 

или, короче в Баше:

bc -l <<< '720/304*360' 
2

Постарайтесь сделать это:

echo 'scale=2; 720/304 * 360' | bc 

scale нужен здесь, как я уже делаю. И лучше использовать одинарные кавычки, чтобы избежать возможного расширение оболочки.

С , вы можете сделать это тоже (здесь-нить):

bc <<< 'scale=2; 720/304 * 360' 

Или используя здесь-документ:

bc<<'EOF' 
scale=2; 720/304 * 360 
EOF 
+0

Почему bc не округляет число? 'echo' scale = 2; 720/304 * 360 '| bc> 849.60' – Orlo

+0

См. http://brskari.wordpress.com/2011/04/23/rounding-values-in-bc/ –

2

Вы можете полностью изменить и/* если вы можете работать с целым результатом:

echo $((720*360/304)) 
852 

Тогда ему не нужны временные нецелые результаты (которые были в вашем заказе int(720/304) = 2, 2 * 360 = 720)

1

Вы должны сделать математический подсчет с помощью awk или bc, если вы хотите иметь определенную точность. но нужно быть осторожным, чтобы использовать округление с bc. так как некоторые операции даст «неожиданный» результат: например:

kent$ echo 'scale=2; 720/304 * 360' |bc 
849.60 
kent$ echo 'scale=3; 720/304 * 360' |bc   
852.480 
kent$ echo 'scale=4; 720/304 * 360' |bc 
852.6240 

поэтому я рекомендую awk:

kent$ awk 'BEGIN{printf "%.2f\n", 720/304*360}' 
852.63 
Смежные вопросы