\FPeval
ceil
当使用或 时会返回多值错误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 错误:评估结果为多个值!” 替换ceil
为round
则不会出现错误。
答案1
fp
不提供与 的ceil
或非运算符,仅提供与(请参阅floor
\FPeval
round
trunc
文档)。无论如何,使用起来更方便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 函数。只有round
and函数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
。