我正在制作一个宏来帮助孩子们估算 5 的 34.1%。
我无法让计算输出具有适当(最小)小数位的精确数字。相反,PGF 显示 5 的 40% 是 1.99997
我该如何解决这个问题?将来我可能需要指定小数点后的最大位数时该怎么办?
\documentclass{article}
\usepackage{tikz}
\usepackage{pgf}
\usepackage[margin=1.5cm]{geometry}
\title{Percents of Whole Numbers on a Number Line}
\date{}
\author{}
\setlength{\parindent}{0pt}
\newcommand{\percentA}[2]
{
\begin{tikzpicture}[xscale=18]
\foreach \x in {0,1,...,#1}
{
\node at (\x/#1,0.45) {\x}; % Whole numbers
\draw [very thick] (\x/#1,0)--(\x/#1,0.25); % Whole number tick marks
}
\draw[very thick] (0,0)--(1,0); % x axis
\foreach \x in {0,...,100} % Hundredths tick marks
\draw (\x/100,-0.1)--(\x/100,0);
\foreach \x in {0,1,2,...,10}
{
\draw[thick] (\x/10,-0.18)--(\x/10,0); % Tenths tick marks
\pgfmathsetmacro{\tenspercents}{int(\x*10)}
\node at (\x/10,-0.6) {\tenspercents \%};
\node at (\x/10,-1) {of #1};
\pgfmathsetmacro{\result}{\tenspercents/100*#1,}
\node at (\x/10,-1.4) {is \result};
}
\end{tikzpicture}
}
\begin{document}
\pagestyle{empty}
\maketitle
\percentA{5}
\end{document}
该代码产生如下结果:
答案1
正如我在回答您的另一个问题时所说,您希望格式化数字以使其漂亮地打印出来。在这种情况下,我猜默认格式会很合适,但您显然可以根据您的特定需求进行调整。
\documentclass[border=10pt,multi,tikz]{standalone}
\newcommand{\percentA}[2]
{%
\begin{tikzpicture}[xscale=18]
\foreach \x in {0,1,...,#2}
{
\node at (\x/#2,0.45) {\x}; % Whole numbers
\draw [very thick] (\x/#2,0)--(\x/#2,0.25); % Whole number tick marks
}
\draw[very thick] (0,0)--(1,0); % x axis
\foreach \x in {0,...,100} % Hundredths tick marks
\draw (\x/100,-0.1)--(\x/100,0);
\foreach \x in {0,1,2,...,10}
{
\draw[thick] (\x/10,-0.18)--(\x/10,0); % Tenths tick marks
\pgfmathsetmacro{\tenspercents}{int(\x*10)}
\node at (\x/10,-0.6) {\tenspercents \%};
\node at (\x/10,-1) {of #2};
\pgfmathsetmacro{\myresult}{\tenspercents/100*#2}
\node at (\x/10,-1.4) {is \pgfmathprintnumber{\myresult}};
}
\end{tikzpicture}%
}
\begin{document}
\percentA{20}{5}
\end{document}
默认的数学公式永远不会准确。例如,如果您需要准确度,可以使用浮点数。但我怀疑这对于二年级数学来说是否真的有必要(假设这仍然是针对二年级学生的)。只需打印数字以使其更漂亮就足够了。
编辑
我的答案的这一部分使用了您稍后发布的替代版本的更正版本\percentA
。与第一个版本不同,这只使用 1 个参数,您的示例只给出了 1 个参数。不幸的是,与第一个版本一样,它仍然需要 2 个参数。
还请注意,这两个版本都引入了虚假空格。我在上面更正了这个问题,并在下面注释了替代版本的更正。
还要注意,您不应在希望解析为数字的参数中包含逗号pgfmath
。这会产生问题。例如,数字之后无法正确格式化,因为它包含外来内容。再次,我在上面更正了这个问题,并在下面的注释中重复了更正。
下面的代码旨在演示几种最适用于二年级学生的格式化数字的方法pgfmath
。有关其他选项(例如科学格式),请参阅 Tik钾Z 的手册中详细描述了各个选项。
以下是输出
\percentA{5}
对于 的单一定义\percentA{}
。也就是说,打印的数字在每种情况下都是相同的。所有更改都是 的相关设置/pgf/number format
,如下面的代码所示。
请记住: 所保存的一系列值\result
对于每条数轴都是相同的,因为 的定义\percentA{}
保持不变。\pgfmathprintnumber{}
当将一系列值\result
作为参数输入时,宏的效果会发生变化。
\documentclass[border=10pt,multi,tikz]{standalone}
\newcommand{\percentA}[1]% if you are only going to give one argument, don't say you'll give two
{% avoid introducing spurious spaces
\begin{tikzpicture}[xscale=18]
\foreach \x in {0,1,...,#1}
{
\node at (\x/#1,0.45) {\x}; % Whole numbers
\draw [very thick] (\x/#1,0)--(\x/#1,0.25); % Whole number tick marks
}
\draw[very thick] (0,0)--(1,0); % x axis
\foreach \x in {0,...,100} % Hundredths tick marks
\draw (\x/100,-0.1)--(\x/100,0);
\foreach \x in {0,1,2,...,10}
{
\draw[thick] (\x/10,-0.18)--(\x/10,0); % Tenths tick marks
\pgfmathsetmacro{\tenspercents}{int(\x*10)}
\node at (\x/10,-0.6) {\tenspercents \%};
\node at (\x/10,-1) {of #1};
\pgfmathsetmacro{\result}{\tenspercents/100*#1}% comma is not part of number!!
\node at (\x/10,-1.4) {is \pgfmathprintnumber{\result}};
}
\end{tikzpicture}% avoid introducing spurious spaces
}
\begin{document}
\percentA{5}
\tikzset{%
/pgf/number format/.cd,
fixed,
precision=2,
}
\percentA{5}
\tikzset{%
/pgf/number format/.cd,
fixed zerofill,
}
\percentA{5}
\tikzset{%
/pgf/number format/.cd,
precision=0,
}
\percentA{5}
\tikzset{%
/pgf/number format/.cd,
int trunc,
}
\percentA{5}
\end{document}
答案2
另一种方法需要lualatex
进行百分比计算。还有一些其他优化(不需要lualatex
):
\RequirePackage{luatex85}% Currently needed in TeXLive 2016
\documentclass[border=5,varwidth=20cm]{standalone}
\usepackage{tikz}
\newcommand{\percentA}[2][1]
{%
\begin{tikzpicture}[xscale=18]
\foreach \x in {0,#1,...,#2}
\draw [very thick] (\x/#2,0)--(\x/#2,0.25)
node [above] {\x}; % Whole number tick marks
\draw[very thick] (0,0)--(1,0); % x axis
\foreach \x in {0,...,100} % Hundredths tick marks
\draw (\x/100,-0.1)--(\x/100,0);
\foreach \x in {0,1,2,...,10}
{
\edef\tenspercents{\directlua{tex.print(\x*10)}}
\edef\myresult{\directlua{tex.print(\tenspercents/100*#2)}}
\draw[thick] (\x/10,0)--(\x/10,-0.18)
node [at end, below, align=center]
{\tenspercents \% \\ of #2 \\ is \myresult};
}
\end{tikzpicture}%
}
\begin{document}
\foreach \p/\s in {5/1, 10/1, 15/1, 20/2, 50/5, 400/50}{
\percentA[\s]{\p}
\\[1em]
}
\end{document}