【问题标题】:Bash - echo percentage with no decimal point with result returned from bc commandBash - 没有小数点的回显百分比,结果从 bc 命令返回
【发布时间】:2019-07-09 03:57:26
【问题描述】:

我使用bc 进行简单的百分比计算。我要做的是以整数格式打印百分比,例如:

压缩比:72%

这是我正在做的事情:

echo "Compression ratio: $(bc <<< "scale=2; $output_size / $input_size * 100")%";

产生以下输出:

压缩比:72.00%

我知道问题的原因是scale=2。将其更改为 scale=0 会导致将 0.72 的 $output_size / $input_size 四舍五入为 0,然后再乘以 100,从而导致不希望的输出。

我试过这些,但没有用:

echo "Compression ratio: $(bc <<< "scale=2; $output_size / $input_size" * 100)%";
echo "Compression ratio: $((bc <<< "scale=2; $output_size / $input_size" * 100))%";

如何正确地将* 100 放在bc 之外?

【问题讨论】:

  • echo .72 | awk '{printf "%2.0f%%\n", 100 * $1}'
  • echo .72 | awk '{print 100 * $1}' | xargs printf '%2.0f%%\n'
  • echo .72 | tr -d . | xargs printf '%2.0f%%\n'
  • @WilliamPursell 谢谢,他们解决了问题,除了我必须将echo -n "Compression ratio:"; 放在单独的行上。

标签: bash bc


【解决方案1】:

不要使用回声。 Printf 允许您指定格式字符串:

printf "Compression ratio: %2.0f%%\n" "$(bc <<< "scale=2; $output_size / $input_size * 100")"

【讨论】:

  • ./compress.sh: line 90: printf: 72.00: invalid number ___ 看来printf 需要一个整数。
  • @Livy,修复它
  • @jeremysprofile 嗯,我没有看到你编辑的内​​容。 $(bc &lt;&lt;&lt; "scale=2; 72 / 100 * 100") 结果为0.72 * 100,最终结果为72.00,对于printf,这被认为是无效数字。
  • 使用独立的printf 命令而不是Bash 的内置printf 和env printf '%q'。因为 Bash 内置的printf 在格式化浮点数时被破坏,所以要求浮点数参数表达为本地的LC_NUMERIC 格式而不是POSIX 浮点数表示。见stackoverflow.com/a/56909997/7939871
  • @Livy,对我来说,它不适用于 $(bc...) 子shell 周围的引号。
【解决方案2】:

你可以试试这个方法:

echo "Compression ratio: $(bc <<< "scale=2; x = 8 / 7 * 100; scale = 0; x / 1")%";

输出:

Compression ratio: 114%

【讨论】:

  • 我决定使用上面建议的printf 选项。虽然你的代码 sn-p 不是很干净,但它确实符合我的问题。
【解决方案3】:

使用shell内置整数运算:

echo "Compression ratio: $(((100*output_size)/input_size))%"

使用bc 计算器和带有env printf (1) 的平点数字格式:

env printf "Compression ratio: %.0f%%\n" $(bc <<< "scale=2; $output_size / $input_size * 100")

  1. 不要使用 Bash 内置的 printf '%f' ${value} 来格式化浮点数,因为它需要根据环境变量 LC_NUMERIC 来格式化 value,而不是接受 POSIX 格式。

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多