División en secuencia de comandos y coma flotante

Me gustaría hacer la siguiente operación en mi script:

1 - ((m - 20) / 34) 

Me gustaría asignar el resultado de esta operación a otra variable. Quiero que mi script use matemáticas de coma flotante. Por ejemplo, para m = 34:

 results = 1 - ((34 - 20) / 34) == 0.588 

Puede usar la calculadora bc . Hará matemática de precisión arbitraria usando decimales (no punto flotante binario) si establece increease scale desde su valor predeterminado de 0:

 $ m=34 $ bc <<< "scale = 10; 1 - (($m - 20) / 34)" .5882352942 

La opción -l cargará la biblioteca matemática estándar y la escala predeterminada a 20:

 $ bc -l <<< "1 - (($m - 20) / 34)" .58823529411764705883 

A continuación, puede usar printf para formatear la salida, si así lo desea:

 printf "%.3f\n" "$(bc -l ...)" 

Bash no hace matemática en coma flotante. Puede usar awk o bc para manejar esto. Aquí hay un ejemplo de awk:

 $ m=34; awk -vm=$m 'BEGIN { print 1 - ((m - 20) / 34) }' 0.588235 

Para asignar la salida a una variable:

 var=$(awk -vm=$m 'BEGIN { print 1 - ((m - 20) / 34) }') 

Enseñar bash, por ejemplo, división entera con resultados de coma flotante:

 #!/bin/bash div () # Arguments: dividend and divisor { if [ $2 -eq 0 ]; then echo division by 0; exit; fi local p=12 # precision local c=${c:-0} # precision counter local d=. # decimal separator local r=$(($1/$2)); echo -n $r # result of division local m=$(($r*$2)) [ $c -eq 0 ] && [ $m -ne $1 ] && echo -n $d [ $1 -eq $m ] || [ $c -eq $p ] && return local e=$(($1-$m)) let c=c+1 div $(($e*10)) $2 } result=$(div 1080 633) # write to variable echo $result result=$(div 7 34) echo $result result=$(div 8 32) echo $result result=$(div 246891510 2) echo $result result=$(div 5000000 177) echo $result 

Salida:

  1.706161137440 0.205882352941 0.25 123445755 28248.587570621468 
 echo $a/$b|bc -l 

da el resultado

Ejemplo:

 read ab echo $a/$b|bc -l 

Ingrese un valor de a & b como 10 3, obtiene 3.3333333333

Si desea almacenar el valor en otra variable, utilice el código

 read ab c=`echo $a/$b|bc -l` echo $c 

También da el mismo resultado que arriba. Intentalo…

Sé que este es un hilo viejo, pero parecía un proyecto divertido de abordar sin usar bc o invocar recursión. Estoy seguro de que se puede mejorar, pero esto maximizó mi habilidad.

 numerator=5 denominator=7 # - 0 -> returns "undef" decimal_places=4 # - 0 -> same as echo $(( $numerator / $denominator )) _result_sign="" let _dp_exp=10**decimal_places if [ $denominator -eq 0 ]; then _div_result_int_large=0; else let _div_result_int_large=$((numerator * _dp_exp / denominator)); fi if [ $_div_result_int_large -lt 0 ]; then let _div_result_int_large=$(( _div_result_int_large * -1 )); _result_sign="-"; fi let _div_result_int=$((_div_result_int_large / _dp_exp)) let _div_result_mant=$((_div_result_int_large - _div_result_int * _dp_exp)) let _dp_lzeros=$((decimal_places - ${#_div_result_mant})) printf -v _div_result_mant_padded "%.${_dp_lzeros}d$_div_result_mant" div_result="$_result_sign$_div_result_int" if [ $decimal_places -gt 0 ]; then div_result="$_result_sign$_div_result_int.$_div_result_mant_padded"; fi if [ $denominator -eq 0 ]; then div_result="undef"; fi echo $div_result 

Ejemplo de salida:

 numerator=5 denominator=7 decimal_places=5 -> 0.71428 numerator=250 denominator=13 decimal_places=0 -> 19 numerator=-5 denominator=6 decimal_places=2 -> -0.83 numerator=3 denominator=0 # - uh-oh decimal_places=2 # - can be anything, in this case -> undef 

Utilice este script para abrir este archivo con el editor favorito como:

 $ sudo vim /usr/bin/div 

Luego pega este código:

 #!/bin/bash # Author: Danial Rikhteh Garan (danial.rikhtehgaran@gmail.com) if [[ -z "$1" ]] || [[ -z "$2" ]]; then echo "Please input two number" echo "for 100/50 use: div 10 50" exit 1; fi div=$(echo "$1/$2" | bc -l); echo 0$div | sed 's/[0]*$//g' 

Ahora chmod it a 755:

 $ sudo chmod 755 /usr/bin/div 

Ahora úsalo:

 $ div 5 100 0.05 

En tu script puedes usar esto:

 var=$(div 5 100); echo "$var"