【问题标题】:How to calculate percentage in shell script如何在shell脚本中计算百分比
【发布时间】:2017-06-22 09:46:53
【问题描述】:

我在我的 shell 代码中使用了以下脚本行 百分比=echo "scale=2; $DP*100/$SDC" | bc 它返回 .16 作为输出,但我需要它作为 0.16

【问题讨论】:

标签: shell


【解决方案1】:

使用 bc 的符合 Posix 的解决方案:

#!/bin/sh
Percent="$(echo "
  scale=2;
  a = $DP * 100 / $SDC;
  if (a > -1 && a < 0) { print "'"-0"'"; a*=-1; }
  else if (a < 1 && a > 0) print 0;
  a" | bc)"

对于答案在 -1 和 1(不包括)但不为零的情况进行所有这些特殊检查,这有点难看。

让我们改用 awk 这个符合 Posix 的解决方案:

#!/bin/sh
Percent="$(echo "$DP" "$SDC" |awk '{printf "%.2f", $1 * 100 / $2}')"

Z shell 可以原生地做到这一点:

#!/bin/zsh
Percent="$(printf %.2f $(( DP * 100. / SDC )) )"

(点是指示 zsh 使用浮点数学所必需的。)

使用字符串操作的本地 Posix 解决方案(假设整数输入):

#!/bin/sh
#                                    # e.g. round down   e.g. round up
#                                    # DP=1 SDC=3        DP=2 SDC=3
Percent=$(( DP * 100000 / SDC + 5))  # Percent=33338     Percent=66671
Whole=${Percent%???}                 # Whole=33          Whole=66
Percent=${Percent#$Whole}            # Percent=338       Percent=671
Percent=$Whole.${Percent%?}          # Percent=33.33     Percent=66.67

这会计算出所需答案的 1,000 倍,这样我们就拥有了最终解决百分之一所需的所有数据。它加了五,所以我们可以正确地截断千分位。然后我们将临时变量$Whole 定义为截断的整数值,我们暂时将其从$Percent 中去除,然后我们附加一个点和小数,不包括千分之一(我们弄错了,所以我们可以正确舍入百分之一)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多