如何在浮点数上使用expr?

问题描述 投票:0回答:7

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

20 / 30 * 100

应该是

66.67
,但是expr说的是
0
,因为它不支持浮动。 Linux 中什么命令可以代替 expr 并进行此等式?

bash floating-point rounding fixed-point
7个回答
39
投票

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

17
投票

只需在awk中完成即可

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

将其保存到变量

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667

15
投票

我一般使用perl:

perl -e 'print 10 / 3'

7
投票

如 bash 手册页中所述:

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

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

let j=20*100/30
echo $j

66

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

let j=20*10000/30
echo $j

66666


5
投票
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

这是 paxdiablo 答案的简化。 -l 将小数位数(小数点后的位数)设置为 20。它还加载带有三角函数和其他内容的数学库。


0
投票

另一个明显的选择:

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

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

python3


0
投票

expr 不支持浮点数,
你可以制作一个简单的c计算器并使用,

 ./mycal 22 / 7.0

© www.soinside.com 2019 - 2024. All rights reserved.