web-dev-qa-db-ja.com

floatでexprを使用する方法は?

私はそれが本当に愚かな質問であることを知っていますが、bashでこれを行う方法がわかりません:

20 / 30 * 100

それは66.67である必要がありますが、浮動小数点数をサポートしていないため、exprは0と言っています。 Linuxのどのコマンドがexprを置き換え、この等式を実行できますか?

24
lauriys

Bashのmanページで報告されているように:

シェルでは、特定の状況下で算術式を評価できます。評価はオーバーフローのチェックなしで固定幅整数で行われますが、0による除算はトラップされ、エラーとしてフラグが立てられます。

より良い部分的な結果を得るために、前に100を掛けることができます。

let j=20*100/30
echo $j

66

または、10のより高い倍数で、それが属する小数点以下の桁数を想像してください。

let j=20*10000/30
echo $j

66666

bcがこれを行いますが、順序は重要です。

> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00

または、特定のケースの場合:

> export ach_gs=2
> export ach_gs_max=3
> x=$(echo "scale = 2; $ach_gs * 100 / $ach_gs_max" | bc)
> echo $x
66.66

どの方法を選択しても、これはあなたの人生を楽にする関数として組み込むのに熟しています。

#!/bin/bash
function pct () {
    echo "scale = $3; $1 * 100 / $2" | bc
}

x=$(pct 2 3 2) ; echo $x # gives 66.66
x=$(pct 1 6 0) ; echo $x # gives 16
32
paxdiablo

私は通常Perlを使用します:

Perl -e 'print 10 / 3'
14
pgl

ただawkでそれをしてください

# awk 'BEGIN{print 20 / 30 * 100}'
66.6667

変数に保存します

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
10
ghostdog74
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

これはpaxdiabloによる回答の簡略化です。 -lは、スケール(10進数の後の桁数)を20に設定します。また、trig関数などを含む数学ライブラリをロードします。

4
bjc