bash + 如何从数字计算百分比

yae*_*ael 5 bash numeric-data

如何从数字计算百分比

例如我们设置

number=248
Run Code Online (Sandbox Code Playgroud)

我们想知道 $number 的 80% 是多少

那么如何在 bash 中计算它呢?

预期输出 198(正好是 198.4,但我们想用 floor 向下舍入)

Dop*_*oti 10

bash 不能做浮点数学,但如果你不需要很高的精度,你可以为这样的事情伪造它:

$ number=248
$ echo $(( number*80/100 ))
198
Run Code Online (Sandbox Code Playgroud)

  • 这是因为,正如我提到的,“bash”无法进行浮点数学运算,因此 0.8 会被截断为 0。如果您想要一位小数的精度,“$((1*80/10))”会返回 8,这给出了你可以使用 (10*`number`) 的整数部分来做你想做的事。这些截断错误就是我在答案中添加“如果不需要太多精度”的附加条件的具体原因。 (2认同)

ImH*_*ere 5

Bash 本身无法处理浮点数学。最好的办法是这样使用bc:

$ bc <<<"248*80/100"
198
Run Code Online (Sandbox Code Playgroud)

shell (bash,sh) 只能计算整数:

$ bash -c 'echo $((248*80/100))'
198
Run Code Online (Sandbox Code Playgroud)

ksh93 能够处理浮点数学:

$ ksh -c 'echo $((248*0.8))'
198.4
Run Code Online (Sandbox Code Playgroud)

并使用 0 位小数的格式:

$ ksh -c 'printf "%.0f\n" "$((248*0.8))"'
Run Code Online (Sandbox Code Playgroud)

zsh 的做法不同:

$ zsh -c 'echo $((248*0.8))'
198.40000000000001
Run Code Online (Sandbox Code Playgroud)

但如果格式化将下降到正确的值:

$ zsh -c 'printf "%.0f\n" "$((248*0.8))"'
198
Run Code Online (Sandbox Code Playgroud)

此外,awk 可以做到:

$ awk -vn=248 'BEGIN{print(n*0.8)}'
198.4
Run Code Online (Sandbox Code Playgroud)

或者,小数点为零:

$ awk -vn=248 'BEGIN{printf("%.0f\n",n*0.8)}'
198
Run Code Online (Sandbox Code Playgroud)