我需要定义一个 Roundup 函数,它是“定义为等于或高于其输入的最小数字(精确到小数点后一位)。“例如,四舍五入 (4.02) 为 4.1;四舍五入 (4.00) 为 4.0。
到目前为止,我已经想出了这个 MWE,它几乎做的工作:
\documentclass{article}
\usepackage{pgfmath}
\newcommand{\roundup}[1]{%
\pgfmathparse{(ceil(#1*10)/10}%
\pgfmathprintnumberto[precision=1,fixed]{\pgfmathresult}{\roundednumber}
\roundednumber%
}%
\begin{document}
roundup(4.02) = \roundup{4.02} \qquad (should be 4.1)
roundup(4.0) = \roundup{4.0} \qquad (should be 4.0)
roundup(-0.27) = \roundup{-0.27} \qquad (should be -0.2)
\textbf{Problem : }
roundup(-0.2) = \roundup{-0.2}\qquad (should be -0.2)
\textbf{Reason}
\pgfmathparse{ceil(-2)}\pgfmathresult \qquad(this is OK)
\pgfmathparse{ceil(-0.2*10)}\pgfmathresult \qquad(\textbf{this is KO})
\end{document}
然而,有时它会带来问题。
最后,它归结为 ceil 函数,以及 pgfmath 如何处理十进制数。
我该如何纠正这种行为?
答案1
您可以使用expl3
及其浮点模块。
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\roundup}{m}
{
\fp_eval:n { ceil(#1,1) }
\fp_compare:nT { ceil(#1,1)=ceil(#1,0) } {.0}
}
\ExplSyntaxOff
\begin{document}
roundup(4.02) = \roundup{4.02} \qquad (should be 4.1)
roundup(4.0) = \roundup{4.0} \qquad (should be 4.0)
roundup(3.91) = \roundup{3.91} \qquad (should be 4.0)
roundup(-0.27) = \roundup{-0.27} \qquad (should be -0.2)
roundup(-0.2) = \roundup{-0.2}\qquad (should be -0.2)
\end{document}
该\fp_compare:nT
位用于添加不会出现.0
的尾随\fp_eval:n
。
解释:ceil(<expression>,<digits>)
计算小数部分的上限<digits>
;ceil(<expression>,0)
相当于ceil(<expression>)
。