答案1
关于精度:
这是在计算机上计算非整数时常见的问题。简而言之,它们有一个分辨率,即它们可以处理的最小数字,所有数字都是这个分辨率的倍数。这会导致各种舍入误差,如果进行大量计算,这些误差可能会累积起来。
PGF 通常使用 TeX 定点算法,小数部分使用 16 位。计算时,数字被视为整数。其中一个问题是除法是通常的截断整数除法。
TeX 最小可能数字的单位是缩放点 (sp),即 (1/65536)pt 或 0.000015258789pt。3pt 在内部表示为 3*65536sp = 196608sp。将其除以 10 可得到 19660.8sp,但 0.8 会被截断,导致 19660sp。将其缩放为 pt 可得到 0.299987792969pt,显示为“0.29999pt”,因为 TeX 四舍五入为 5 位数字。如果直接输入 0.3,则在内部表示为 19661sp,即 0.300003051758pt,显示为“0.3pt”。
如果您需要更高的精度,可以查看 PGFs fpu 库。
删除 pt 并对输出进行四舍五入:
您使用了\pgfmathsetlengthmacro
,它将单位 pt 添加到数字中。相反,您应该使用\pgfmathsetmacro
,它只存储数字(不带单位)。
要对数字进行四舍五入,您可以使用 PGF 数字打印宏。这\pgfmathprintnumberto
很有用。在您的示例中,它将宏设置为“0.3”。您可能需要查看选项/pgf/number format/fixed
,/pgf/number format/fixed zerofill
以及/pgf/number format/precision
设置数字打印。
示例代码:
\documentclass[border=1pt]{standalone}
\usepackage{tikz}
\begin{document}
\pgfmathsetmacro{\x}{3}
\pgfmathsetmacro{\y}{10}
\begin{tabular}{ll}
with \verb|\pgfmathsetlengthmacro|
&
\pgfmathsetlengthmacro{\z}{\x/\y}
$\x \div \y = \z$
\\
with \verb|\pgfmathsethmacro|
&
\pgfmathsetmacro{\z}{\x/\y}
$\x \div \y = \z$
\\
with \verb|\pgfmathparese| and \verb|\pgfmathprintnumberto|
&
\pgfmathparse{\x/\y}\pgfmathprintnumberto{\pgfmathresult}{\z}
$\x \div \y = \z$
\\
with \verb|\pgfmathsethmacro| and \verb|\z| set to 0.3
&
\pgfmathsetmacro{\z}{0.3}
$\x \div \y = \z$
\end{tabular}
\end{document}
结果: