2016-03-25 4 views
2
answer=$(echo $((length/1024)) | bc -l) 

так что длина - это переменная, которая имеет значение, как 2402267538., и его необходимо разделить на 1024.Как делить числа с плавающей запятой на переменные с целым результатом?

выполнения этого выдает эту ошибку

")syntax error: invalid arithmetic operator (error token is " 
+0

[Your comme nt здесь] (https://stackoverflow.com/questions/36216164/how-to-divide-floating-point-numbers-using-variables-with-integer-result#comment60065970_36216323) вызван символом возврата каретки (конец строки в окнах) в тексте. Удалите их из переменной 'length', чтобы все работало правильно. Возможно, вот так: 'length = $ {length // [! - 0-9] /}' –

ответ

0

Когда вы делаете:

echo $((length/1024)) | bc -l 

Вы уже потеряли часть после запятой, а затем bc -l как $((length/1024)) выполняет целочисленное деление.

Вы можете использовать bc -l так:

length="2402267538" 
answer=$(bc -l <<<"scale=2; $length/1024") 
echo "$answer" 

2345964.39 

Немного более многословным, используя awk:

answer=$(awk -v len=$length 'BEGIN{printf "%.2f\n", len/1024}') 
echo "$answer" 

2345964.39 

Или это:

answer=$(awk -v len=$length 'BEGIN{printf "%d\n", len/1024}') 
echo "$answer" 

2345964 
+0

Первый ответ вызывает такую ​​ошибку (standard_in) 1: незаконный символ:^M и второй ответ сохраняет два десятичных значения после вычисления – Animesh

+0

[Ниже приведена рабочая демонстрация обоих фрагментов кода] (http://ideone.com/Z9hojn) – anubhava

+0

Если вы не хотите ограничивать до 2 десятичных знаков, используйте: 'awk -v len = $ length 'BEGIN {printf "% f \ n", len/1024}' ' – anubhava

0

Переключение ksh упростит задачу:

$ length=2402267538 

$ answer=$((length/1024.00)) 
$ echo $answer 
2345964.392578125 

Один из способов с AWK:

$ answer=$(awk "BEGIN{printf(\"%f\n\",$length/1024);}") 
$ echo $answer 
2345964.392578 

Если вам нужно только целую часть результата (работает как с bash и ksh):

$ answer=$((length/1024)) 
$ echo $answer 
2345964 

Если ваша переменная длина является с плавающей запятой, вы можете обрезать его таким образом:

$ length=2402267538.12 
$ ilength=${length%%.*} 
$ answer=$((ilength/1024)) 
$ echo $answer 
2345964 
+0

используя приведенный выше оператор, как просто сохранить значение до десятичной точки? – Animesh

+0

Не используйте переменную shell в awk, как это, передайте ее awk, используя '-v var =" $ var "' – anubhava

+0

@anubhava Обычно я этого не делаю. Однако это не запрещено, нужно просто быть осторожным. – jlliagre