四舍五入为小数 pgfmath

四舍五入为小数 pgfmath

我需要定义一个 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}

然而,有时它会带来问题。

MWE 输出

最后,它归结为 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>)

相关内容