如何在浮点数上使用expr?

lau*_*iys 25 floating-point bash fixed-point rounding

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

20 / 30 * 100
Run Code Online (Sandbox Code Playgroud)

它应该是,66.67但expr说0,因为它不支持浮动.Linux中的哪个命令可以替换expr并执行此等式?

pax*_*blo 32

bc 会为你做这件事,但订单很重要.

> echo "scale = 2; 20 * 100 / 30" | bc
66.66
> echo "scale = 2; 20 / 30 * 100" | bc
66.00
Run Code Online (Sandbox Code Playgroud)

或者,对于您的具体情况:

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

无论您选择哪种方法,这都是成熟的功能,可以让您的生活更轻松:

#!/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
Run Code Online (Sandbox Code Playgroud)


pgl*_*pgl 14

我一般用perl:

perl -e 'print 10 / 3'
Run Code Online (Sandbox Code Playgroud)

  • 我恐怕无法帮助.我所能建议的是在表达式的末尾添加`,"\n"`:`perl -e'print 10/3,"\n"'` (2认同)

gho*_*g74 10

只是在awk中这样做

# awk 'BEGIN{print 20 / 30 * 100}'
66.6667
Run Code Online (Sandbox Code Playgroud)

将其保存到变量

# result=$(awk 'BEGIN{print 20 / 30 * 100}')
# echo $result
66.6667
Run Code Online (Sandbox Code Playgroud)

  • 这个答案非常尴尬. (4认同)

Con*_*ler 6

正如bash手册页中所述:

在某些情况下,shell允许计算算术表达式...评估是在固定宽度的整数中完成的,没有检查溢出,但是除0被捕获并标记为错误.

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

let j=20*100/30
echo $j
Run Code Online (Sandbox Code Playgroud)

66

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

let j=20*10000/30
echo $j
Run Code Online (Sandbox Code Playgroud)

66666


bjc*_*bjc 5

> echo "20 / 30 * 100" | bc -l
66.66666666666666666600
Run Code Online (Sandbox Code Playgroud)

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