33

我知道这是一个非常愚蠢的问题,但我不知道如何在 bash 中做到这一点:

20 / 30 * 100

应该是,66.67但 expr 说的是0,因为它不支持浮动。Linux 中的什么命令可以代替 expr 并做这个等式?

4

6 回答 6

36

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
于 2009-08-10T09:52:12.560 回答
14

只需在 awk 中执行

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

将其保存到变量

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
于 2009-08-10T10:17:35.273 回答
14

我通常使用 perl:

perl -e 'print 10 / 3'
于 2009-08-12T15:19:44.187 回答
7

如 bash 手册页中所述:

在某些情况下,shell 允许对算术表达式进行求值……求值是在固定宽度的整数中完成的,不检查溢出,尽管除以 0 会被捕获并标记为错误。

您可以提前乘以 100 以获得更好的部分结果:

let j=20*100/30
echo $j

66

或者是 10 的更高倍数,并想象它所属的小数位:

let j=20*10000/30
echo $j

66666

于 2009-08-10T09:55:21.807 回答
5
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

这是paxdiablo对答案的简化。-l 将比例(小数点后的位数)设置为 20。它还加载了一个带有三角函数和其他东西的数学库。

于 2016-09-14T09:13:55.583 回答
0

另一个明显的选择:

python -c "print(20 / 30 * 100)"

假设您使用的是 Python 3。否则,请使用python3.

于 2020-01-31T21:52:06.810 回答