如何在浮点上使用 expr?

发布于 2024-08-02 00:34:36 字数 182 浏览 8 评论 0原文

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

20 / 30 * 100

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

I know it's really stupid question, but I don't know how to do this in bash:

20 / 30 * 100

It should be 66.67 but expr is saying 0, because it doesn't support float.
What command in Linux can replace expr and do this equalation?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

回眸一遍 2024-08-09 00:34: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

bc will do this for you, but the order is important.

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

or, for your specific case:

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

Whatever method you choose, this is ripe for inclusion as a function to make your life easier:

#!/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
森林很绿却致人迷途 2024-08-09 00:34:36

只需在 awk 中执行即可

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

将其保存到变量中

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

just do it in awk

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

save it to variable

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
泪之魂 2024-08-09 00:34:36

我一般使用perl:

perl -e 'print 10 / 3'

I generally use perl:

perl -e 'print 10 / 3'
你げ笑在眉眼 2024-08-09 00:34:36

正如 bash 手册页中所报道的:

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

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

let j=20*100/30
echo $j

66

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

let j=20*10000/30
echo $j

66666

As reported in the bash man page:

The shell allows arithmetic expressions to be evaluated, under certain circumstances...Evaluation is done in fixed-width integers with no check for overflow, though division by 0 is trapped and flagged as an error.

You can multiply by 100 earlier to get a better, partial result:

let j=20*100/30
echo $j

66

Or by a higher multiple of 10, and imagine the decimal place where it belongs:

let j=20*10000/30
echo $j

66666

迷爱 2024-08-09 00:34:36
> echo "20 / 30 * 100" | bc -l
66.66666666666666666600

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

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

This is a simplification of the answer by paxdiablo. The -l sets the scale (number of digits after the decimal) to 20. It also loads a math library with trig functions and other things.

乖不如嘢 2024-08-09 00:34:36

另一个明显的选择:

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

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

Another obvious option:

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

assuming you are using Python 3. Otherwise, use python3.

[旋木] 2024-08-09 00:34:36

expr 不支持浮点数,
您可以制作一个简单的 C 计算器,只需使用

./mycal 22 / 7.0

expr doesn;t support float,
You can make a simple c calculator and just use,

./mycal 22 / 7.0

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文