为什么 TikZ 中的 \foreach 命令对于步长 0.1 给出错误结果?

为什么 TikZ 中的 \foreach 命令对于步长 0.1 给出错误结果?

为什么下面的代码\foreach无法给我整数?

\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}

\usetikzlibrary{positioning, calc}

\begin{document}
    \begin{tikzpicture}
\foreach\x in {0.1,0.2,...,0.9}\node at (0,{-2*\x}){\tiny\x};
    \end{tikzpicture}
\end{document}

答案1

更技术性的解释是,您的步长(十进制数0.1)没有精确的二进制表示。在二进制中,它具有无限的表示0.0001100110011...,类似于1/3 == 0.3333...十进制。

因此,如果您0.1使用有限数量的位数来表示,则始终存在错误。这就是您在这里看到的。正如 percusse 所说,当pgf多次添加不准确的步长值时,此错误会累积。

然而情况并非总是如此:如果选择的步长能够用二进制精确表示,例如1/80.1250.001二进制),则不会出现错误:

\foreach\x in {0,0.125,...,1}\node at (0,{-2*\x}){\tiny\x};

循环步长为 0.125

1您可以通过调整步长然后缩小步长来减少(但不能消除)错误:

\foreach\x [evaluate=\x as \y using \x/10] in {1,2,...,9}\node at (0,{-2*\y}){\tiny\y};

循环步长为 1,除以 10

答案2

这是因为每当您使用该...符号时,TikZ 都会执行计算,例如第二个数字是多少0.2、第一个数字是多少;0.1那么步长是多少......

然后它进行0.2-0.1操作以获得步长,TeX 精度污染了这个结果。之后 TikZ 开始将污染添加0.10.2(不是0.1因为这些是给定的)。你会得到嘈杂的声音0.3,0.4,...等等。

如果您在列表中明确地写下来0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,您会发现正确打印它们没有问题,因为没有对数字进行任何算术运算并且它们按原样使用。

相关内容