\FPeval ceil 导致“多个值”

\FPeval ceil 导致“多个值”

\FPevalceil当使用或 时会返回多值错误floor,但使用trunc或 则不会round

\documentclass{article}
\usepackage{graphicx} % Required for inserting images
\usepackage{fp}

\begin{document}

\newcommand{\first}{78}
\newcommand{\second}{12}
\FPeval{\result}{ceil(\first / \second, 2)}

\result

\end{document}

错误为:“FP 错误:评估结果为多个值!” 替换ceilround则不会出现错误。

答案1

fp不提供与 的ceil或非运算符,仅提供与(请参阅floor\FPevalroundtrunc文档)。无论如何,使用起来更方便xfp(应成为任何默认 LaTeX 安装的一部分):

在此处输入图片描述

\documentclass{article}

% \usepackage{xfp} % Should form part of any default LaTeX installation
\usepackage{fp}

\begin{document}

\newcommand{\first}{78}%
\newcommand{\second}{12}%
\FPeval{\result}{round((\first) / (\second), 2)}

\result

\fpeval{ceil(\first / \second, 2)}

\end{document}

答案2

fp包既不提供 floor 函数,也不提供 ceiling 函数。只有roundand函数trunc(andclip函数可以删除尾随零)。实际上,这些函数尚未实现,这令人颇感困惑。

round无论如何, and的官方语法trunc是不带逗号的: round(3.14159:2)将返回3.14。但事实证明,逗号也可以使用。

实现地板和天花板fp应该不是那么难,但有更好的方法,功能。

没有任何软件包,只要你的 LaTeX 不超过几年,你就可以这样做

\fpeval{ceil(\first/\second,2)}

并得到6.5。这是完全可扩展的,因此甚至可以在类似

\fpeval{ceil(\first/\second,2)}\mylen

其中\mylen是用 定义的某个长度参数\newlength。因此,您不需要将结果存储在宏中。

当然,你可以这样做,但我不会延续不检查我们想要使用的命令的定义性的不良做法。

\documentclass{article}

\ExplSyntaxOn
\NewDocumentCommand{\definefp}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \fp_new:c { l_nvrain_fp_##1_fp }
   }
 }
\NewDocumentCommand{\setfp}{mm}
 {
  \fp_set:cn { l_nvrain_fp_#1_fp } { #2 }
 }
\NewExpandableDocumentCommand{\usefp}{m}
 {
  \fp_use:c { l_nvrain_fp_#1_fp }
 }
\ExplSyntaxOff

\definefp{raw,result}

\begin{document}

\newcommand{\first}{78}
\newcommand{\second}{11}% to make the thing more interesting

\setfp{raw}{\first/\second}
\setfp{result}{ceil(\first/\second,2)}

Raw: \usefp{raw}

Result: \usefp{result}

\end{document}

这样,您就可以确保不会破坏现有的命令,如果\FPeval从不检查将存储结果的命令的名称,则很可能会发生这种情况。

您可以\usefp在任何需要浮点数的地方使用,甚至可以在的第二个参数中,\setfp或者一般在的参数中\fpeval

在此处输入图片描述

相关内容