![pgfmath 函数使用以 0 为前导的数字时产生意外结果](https://linux22.com/image/248565/pgfmath%20%E5%87%BD%E6%95%B0%E4%BD%BF%E7%94%A8%E4%BB%A5%200%20%E4%B8%BA%E5%89%8D%E5%AF%BC%E7%9A%84%E6%95%B0%E5%AD%97%E6%97%B6%E4%BA%A7%E7%94%9F%E6%84%8F%E5%A4%96%E7%BB%93%E6%9E%9C.png)
pgfmath 函数在用于前导零的数字时会产生意外结果。下面示例中的输出是否符合0011
和的预期0021
?
\documentclass{article}
\usepackage{tikz}
\newcommand\truncateline[2]{%
#1 & #2 & \pgfmathtruncatemacro{\foo}{#1}\foo \\%
}
\newcommand\roundline[2]{%
#1 & #2 & \pgfmathround{#1}\pgfmathresult \\%
}
\newcommand\intline[2]{%
#1 & #2 & \pgfmathint{#1}\pgfmathresult \\%
}
\begin{document}
\section{pgfmathtruncatemacro}
\begin{tabular}{lll}
Input & Expected & Output \\
\truncateline{0}{0}
\truncateline{1}{1}
\truncateline{01}{1}
\truncateline{001}{1}
\truncateline{0011}{11}
\truncateline{0021}{21}
\end{tabular}
\section{pgfmathround}
\begin{tabular}{lll}
Input & Expected & Output \\
\roundline{0}{0}
\roundline{1}{1}
\roundline{01}{1}
\roundline{001}{1}
\roundline{0011}{11}
\roundline{0021}{21}
\end{tabular}
\section{pgfmathint}
\begin{tabular}{lll}
Input & Expected & Output \\
\intline{0}{0}
\intline{1}{1}
\intline{01}{1}
\intline{001}{1}
\intline{0011}{11}
\intline{0021}{21}
\end{tabular}
\end{document}
答案1
各州pgfmanual
(第 62.1 条解析表达式的命令,第 526 页(v2.10 版本):
带有零前缀的整数(当然不包括零本身)被解释为八进制数,并自动转换为十进制。
所以021
或者0021
实际上是 2x8+2x1 = 17,而不是 21。
您需要避免或删除前导 0,例如使用如下递归宏:
\def\removeleadingzeros#1{\if0#1 \expandafter\removeleadingzeros\else#1\fi}
但是这在一般情况下不起作用(仅使用0
或00
等会破坏 eg)。使用 扩展数字\the\numexpr <number>\relax
也会将 eg 变成0021
,但这当然会首先21
限制使用 的实用性。pgfmath
在搜索手册并查看源代码后,pgfmathparser.code.tex
这种行为似乎是硬编码的并且不可配置。