【发布时间】:2017-06-22 09:46:53
【问题描述】:
我在我的 shell 代码中使用了以下脚本行
百分比=echo "scale=2; $DP*100/$SDC" | bc
它返回 .16 作为输出,但我需要它作为 0.16
【问题讨论】:
标签: shell
我在我的 shell 代码中使用了以下脚本行
百分比=echo "scale=2; $DP*100/$SDC" | bc
它返回 .16 作为输出,但我需要它作为 0.16
【问题讨论】:
标签: shell
使用 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 中去除,然后我们附加一个点和小数,不包括千分之一(我们弄错了,所以我们可以正确舍入百分之一)。
【讨论】: