为什么下面的代码\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/8
或0.125
(0.001
二进制),则不会出现错误:
\foreach\x in {0,0.125,...,1}\node at (0,{-2*\x}){\tiny\x};
1
您可以通过调整步长然后缩小步长来减少(但不能消除)错误:
\foreach\x [evaluate=\x as \y using \x/10] in {1,2,...,9}\node at (0,{-2*\y}){\tiny\y};
答案2
这是因为每当您使用该...
符号时,TikZ 都会执行计算,例如第二个数字是多少0.2
、第一个数字是多少;0.1
那么步长是多少......
然后它进行0.2-0.1
操作以获得步长,TeX 精度污染了这个结果。之后 TikZ 开始将污染添加0.1
到0.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
,您会发现正确打印它们没有问题,因为没有对数字进行任何算术运算并且它们按原样使用。