如何对 bash 数字数组(有些以科学计数法表示)求和?

如何对 bash 数字数组(有些以科学计数法表示)求和?

由于使用 bc 的以下命令不适用于科学计数法中的数字,因此我想知道是否有替代方案,例如使用 awk?

sum=$( IFS="+"; bc <<< "${arrValues[*]}" )

答案1

sum=$(
  awk 'BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}' "${arrValues[@]}"
)

使用 zsh (如果你不使用bash),因为它内部支持浮点数:

sum=$((${(j[+])arrValues}))

ksh93

如果您需要提供的精度bc,您可以预处理数字,以便12e23将其更改为(12*10^23)

sum=$(
  IFS=+
  sed 's/\([0-9.]*\)[eE]\([-+]*[0-9]*\)/(\1*10^\2)/g' <<< "${arrValues[*]}" |
    bc -l
)

答案2

Perl解决方案:

perl -MList::Util=sum -l -e 'print sum(@ARGV)' -- "${array[@]}"

或者对于任意精度:

perl -Mbignum -MList::Util=sum -l -e 'print sum(0, @ARGV)' -- "${array[@]}"

(添加文字0以强制使用 bignums 进行求和)。

相关内容