46

スクリプトで次の操作を実行したいと思います。

1 - ((m - 20) / 34)

この操作の結果を別の変数に代入したいと思います。スクリプトで浮動小数点演算を使用したい。たとえば、m = 34 の場合:

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

6 に答える 6

55

電卓を使用できますbcscaleデフォルトの 0 から増分を設定すると、10 進数 (2 進浮動小数点ではない) を使用して任意精度の計算が行われます。

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

この-lオプションは、標準の数学ライブラリをロードし、スケールをデフォルトで 20 に設定します。

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

必要に応じて、printf を使用して出力をフォーマットできます。

printf "%.3f\n" "$(bc -l ...)"
于 2012-08-27T18:09:24.107 に答える
27

Bash は浮動小数点演算を行いません。これを処理するには、awk または bc を使用できます。awk の例を次に示します。

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

出力を変数に割り当てるには:

var=$(awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }')
于 2012-08-27T18:06:43.110 に答える
0

これが古いスレッドであることは知っていますが、bc再帰を使用したり呼び出したりせずに取り組むのは楽しいプロジェクトのように思えました。改善できると確信していますが、これで私のスキルが限界に達しました。

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

出力例:

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
于 2018-06-21T16:53:28.670 に答える
-1

このスクリプトを使用して、次のようなお気に入りのエディターでこのファイルを開きます。

$ sudo vim /usr/bin/div

次に、次のコードを貼り付けます。

#!/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'

これを 755 に chmod します。

$ sudo chmod 755 /usr/bin/div

今それを使用します:

$ div 5 100
0.05

スクリプトでは、これを使用できます。

var=$(div 5 100);
echo "$var"
于 2016-08-24T04:58:50.867 に答える