round-mode=figures
与 结合使用round-precision
,可以轻松地将给siunitx
定的数字四舍五入到指定数量的有效数字:
\documentclass{article}
\usepackage{siunitx}
\sisetup{round-mode=figures, round-precision=3}
\begin{document}
\num{12.345} \num{0.123}
\end{document}
有没有办法“反转”它以获取数字包含的有效数字的数量/数量,最好存储该数量,例如在计数器中,以便以后访问/使用它?
答案1
这里我设置了一个 tokcycle 循环来查看 token。如果在输入中发现零散的 token,它会将计数器设置sigd
为 -1。
它考虑了前导零和空格。如果参数中的数字符合预期,它只会执行计数(考虑前导零/尾随零)。如果发现杂散字符,则将其添加到内部cytoks
标记寄存器中,这就是宏最终确定有效数字检查应设置为 -1(如果\cytoks
非空)的方式。
编辑:一位观众联系我,指出尾随零有时是其他时候或许非常重要,我在之前的编辑中没有考虑到这一点。如果它们出现在小数点的右边,它们是重要。如果它们出现在个位列或个位列的左侧,则它们可能如果它们表示精度,则很重要。因此,我采用了“规则”,即如果存在小数点,则尾随零很重要。这在 MWE 中的示例 9、9a 和 A 中发挥作用。这需要在从精度数字中减去尾随零之前添加条件测试。
\documentclass{article}
\usepackage{tokcycle}
\newcounter{sigd}
\newcounter{trailingz}
\newif\iffounddot
\newif\ifzerosig
\newcommand\sigdigits[1]{%
\setcounter{sigd}{0}% SIGNIFICANT DIGIT COUNT
\setcounter{trailingz}{0}% TRAILING ZERO COUNT
\founddotfalse% MADE T WHEN DECIMAL HAS BEEN 1ST LOCATED
\zerosigfalse% MADE T WHEN ZERO BECOMES SIGNIFICANT
\tokcycle% CYCLE THROOUGH EACH TOKEN
{\tctestifx{.##1}%
{\iffounddot\throwerr\fi\founddottrue}% IF .
{\tctestifnum{`##1>`/}%
{\tctestifnum{`##1<`:}%
{\tctestifnum{##1>0}%
{\stepcounter{sigd}\zerosigtrue\setcounter{trailingz}{0}}% IF 1-9
{\ifzerosig\stepcounter{sigd}\fi\stepcounter{trailingz}}% IF 0
}%
{\throwerr}% IF ASCII > `9
}%
{\throwerr}% IF ASCII < `0
}%
}% APPLY ABOVE LOGIC FOR CHAR TOKENS
{\throwerr}% IF BRACES
{\throwerr}% IF CONTROL SEQUENCE
{}% IGNORE SPACES
{#1}% THE ARGUMENT
\iffounddot\else\addtocounter{sigd}{-\thetrailingz}\fi% TRAILING ZEROS
\expandafter\ifx\expandafter\relax\detokenize\expandafter{\the\cytoks}%
\relax\else\setcounter{sigd}{-1}\fi% CHECK FOR INVALID INPUT
}
\newcommand\throwerr{\addcytoks{##1}}% ADD INVALID TOKS TO \cytoks
\begin{document}
\noindent
1) \sigdigits{12.3}\thesigd\\
2) \sigdigits{0.123}\thesigd\\
3) \sigdigits{1.2.3}\thesigd\\
4) \sigdigits{1.3\today}\thesigd\\
5) \sigdigits{321.345 678}\thesigd\\
6) \sigdigits{000321.305}\thesigd\\
7) \sigdigits{.000 300 345}\thesigd\\
8) \sigdigits{0003x1.345}\thesigd\\
9) \sigdigits{123000}\thesigd\\
9a) \sigdigits{123000.}\thesigd\\
A) \sigdigits{123.000}\thesigd\\
B) \sigdigits{0003;345}\thesigd\\
\end{document}