制作一个计算平均值的函数

制作一个计算平均值的函数

我如何才能创建一个\newcommand计算三个数字(可以是数字或数字变量)之间的平均值?

用法是

\numberavg{<A>}{<B>}{<C>}

应该可以扩展到三个以上的参数,例如

\numberavg{<A>}{<B>}{<C>}...{<n>}

答案1

另一个xparse/expl3解决方案具有与 Christian Hupfer 的答案相同的界面。它的工作原理类似,但避免使用临时变量以保持可扩展性。这使得在进一步计算中使用结果变得更容易。如果列表为空,它还会返回明确定义的结果 (0)。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\cs_new:Nn\__avercalc_plus:n{
  + ( #1 )
}
\NewExpandableDocumentCommand{\avercalc}{O{1}+m}{%
  \fp_eval:n {
    round(
      ( 0 \clist_map_function:nN { #2 } \__avercalc_plus:n ) / max(1, \clist_count:n { #2 })
      , #1
    )
  }
}
\ExplSyntaxOff

\begin{document}
How I can make to create a newcommand to calculate an average between three numbers (can be numbers or numeric variables)
\def\foo{4.75}
\def\foobar{3.80}
\def\foobarfoo{10.3}

\avercalc{1.5, 3.5, 4}

\avercalc{}

\avercalc[4]{\foobar,\foo,\foobarfoo}
\end{document}

答案2

我建议使用xparseexpl3功能,它应用逗号分隔列表来计算总和,然后除以元素数量。(它还不是万无一失的,因为到目前为止它还没有检查空列表。)

可选参数用于对数字进行四舍五入。

请注意,我的\avercalc宏不可扩展。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\avercalc}{O{1}+m}{%
  \clist_set:Nn \l_tmpa_clist {#2}%
  \fp_zero:N \l_tmpa_fp
  \clist_map_inline:Nn  \l_tmpa_clist {
    \fp_add:Nn \l_tmpa_fp {##1}
  }
  \fp_eval:n { round(\l_tmpa_fp/\clist_count:N \l_tmpa_clist, #1)}
}
\ExplSyntaxOff

\begin{document}
How I can make to create a newcommand to calculate an average between three numbers (can be numbers or nume

ric variables)
    \def\foo{4.75}
\def\foobar{3.80}
\def\foobarfoo{10.3}

\avercalc{1.5, 3.5, 4}

\avercalc[2]{\foobar,\foo,\foobarfoo}

\avercalc[3]{\foobar,\foo,\foobarfoo}

\avercalc[4]{\foobar,\foo,\foobarfoo}
\end{document}

相关内容