如何在浮点数上使用expr?

38

我知道这是一个非常愚蠢的问题,但我不知道如何在bash中执行它:

20 / 30 * 100

结果应该是66.67,但expr 返回0,因为它不支持浮点数。在Linux中,哪个命令可以取代expr执行这个等式?


抱歉,我错了,是我最大的过失! - smok1
对于数学运算,请尝试使用bc或awk,而不是bash或expr。 - ghostdog74
6个回答

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

但我想在脚本中执行这个操作,完整的代码行是: $ach_gs / $ach_gs_max * 100 - lauriys
@maxorq:你可能会注意到,在其他人给出的所有示例中,乘法都是首先执行的。这是科学计算的一件事——因为我们知道小数点左边有更多的数字可用于计算,而右边则没有,所以乘法首先执行以最小化由四舍五入导致的精度损失。 - Conspicuous Compiler

17

在 awk 中处理它就行了。

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

保存到变量中

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

6
这个答案很别扭。 - xdhmoore
1
好的回答。系统中使用awk的可能性比bc更大。 - Guilherme Ferreira

15

通常我使用 Perl:

perl -e 'print 10 / 3'

这可能只是一个非常基本的Perl问题,但是在我的系统上,该命令只显示一个空行。perl -e 'print "hello world"'也不起作用。但是perl -e 'print "hello world\n"'可以按预期工作。 - Sébastien
2
很抱歉,我无法提供帮助。我唯一能建议的是在表达式末尾添加", "\n"":perl -e 'print 10 / 3, "\n"' - pgl
谢谢,这个解决方法有效。(并且你的命令在另一个Linux环境中可以直接使用) - Sébastien
对于我们中的Pythonistas:python -c“print 10.0/3.0” - emazzotta

7

如bash手册所述:

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

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

let j=20*100/30
echo $j

将数字乘以10的更高倍数,想象它所在的小数位:

66

let j=20*10000/30
echo $j

66666


如果您发布实际使用的命令行,可能会有所帮助。(我猜您使用的零比我多。)在发布之前,我执行了上面的命令,并得到了给定的结果。请先尝试那些命令。 - Conspicuous Compiler
嗯,奇怪,我不记得最初在那里放空格了。无论如何,请尝试删除您的空格并重复操作。我编辑了我的帖子以删除有问题的空格。 - Conspicuous Compiler
1
问题是处理浮点数;bash的"let"返回整数。 - HidekiAI
是的,HidekiAI,这就是我说“想象小数点所在位置”的原因。返回的结果66666表示实际值为66666 * 10^-3。 - Conspicuous Compiler

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

这是对paxdiablo答案的简化。 -l将精度设置为20位小数,并加载了一个带三角函数和其他功能的数学库。


0

另一个显而易见的选择:

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

假设您正在使用Python 3。否则,请使用python3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接