BASH:百分比变化 - 如何计算?如何在没有bc的情况下获得绝对价值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BASH:百分比变化 - 如何计算?如何在没有bc的情况下获得绝对价值?相关的知识,希望对你有一定的参考价值。

我需要计算两个值之间的百分比变化。

我在这里的代码:

echo $time1
echo $time2
pc=$(( (($time2 - $time1)/$time1 * 100) ))
echo $pc

在控制台中输出这样的输出(使用set -xe选项)

+ echo 1800
1800
+ echo 1000
1000
+ pc=0
+ echo 0

数学表达式中的代码似乎写得正确,但是,我得到-80左右。为什么这发生在我身上?

问题的第二部分。我没有访问权限,我将无法访问bc命令。从我听到它可以给我我的数字的绝对值。

所以..没有bc命令 - 对于IF条件,这是一个好主意吗?

if (( (( "$pc" > 20 || (( "$pc" < -20 )); then...
答案

正如你所提到的,没有必要在bash中这样做,我建议使用awk:

awk -v t1="$time1" -v t2="$time2" 'BEGIN{print (t2-t1)/t1 * 100}'

通常,awk旨在处理文件,但您可以使用BEGIN块执行计算,而无需将任何文件传递给它。可以使用-v开关将Shell变量传递给它。

如果您希望对结果进行舍入,则可以始终使用printf

awk -v t1="$time1" -v t2="$time2" 'BEGIN{printf "%.0f", (t2-t1)/t1 * 100}'

%.0f格式说明符导致结果四舍五入为整数(浮点数为0位小数)。

另一答案

正确的舍入,nicer空白,没有多余的$标志:

pc=$(( ((((time2 - time1) * 1000) / time1) + (time2 > time1 ? 5 : -5)) / 10 ))
另一答案

也许你想要更喜欢bc + awk混合线,如下所示:

total=70
item=30
percent=$(echo %$(echo "scale = 2; ($item / $total)" | bc -l | awk -F '.' '{print $2}'))
echo $percent
另一答案

一些说明:

  • 数学是基于整数的,所以你早就得零,因为你分裂了
  • $(( ))语法将扩展变量,因此使用time1而不是$time1
  • 百分比答案是-44而不是-80

这里有些例子:

echo $(( time2-time1 )) # Output: -800
echo $(( (time2-time1)/time1 )) # Output: 0. see it's already zero!
echo $(( (time2-time1)/time1*100 )) # Output: 0. it's still zero and still 'incorrect'
echo $(( (time2-time1)*100 )) # Output: -80000. fix by multiplying before dividing
echo $(( (time2-time1)*100/time1 )) # Output: -44. this is the 'correct' answer
echo $(( (time2-time1)*100/time2 )) # Output: -80. note this is also an 'incorrect' answer

以上是关于BASH:百分比变化 - 如何计算?如何在没有bc的情况下获得绝对价值?的主要内容,如果未能解决你的问题,请参考以下文章

Binance的24小时百分比变化是如何计算的

Shell脚本处理浮点数的运算和比较实例

如何使用 PySpark 逐年获得百分比变化

如何在android中获取电池电量变化(仅当有电量/百分比变化时)?

如何使用 SVM 分类器检测百分比变化中的异常值?

如何回显数学表达式的结果并将其保存到Bash中的变量中