自动确定给定数字中的有效数字的数量

自动确定给定数字中的有效数字的数量

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}

在此处输入图片描述

相关内容