将大数字转换为科学计数法格式

将大数字转换为科学计数法格式

我想将大整数转换为较短的形式;例如

\convert{123456789} = 1.23 x 10^9

有没有什么软件包可以让我这样做?

答案1

PGF 数学引擎可以做到这一点。

此外,该pgfplotstable软件包在四舍五入、格式化,甚至后处理/生成数字内容方面功能非常强大。

\documentclass{standalone}

\usepackage{pgf}

\usepackage{pgfplotstable}

\begin{document}

\pgfmathprintnumber{123456789123456789123456789}

\pgfplotstabletypeset{
A B
1 123456789123456789123456789
2 9876543219876545432198765432222
}
\end{document}

在此处输入图片描述

答案2

这不是该软件包的核心目标,但siunitx确实内置了大量的数字处理代码:

\documentclass{article}
\usepackage{siunitx}
\begin{document}

$\num{123456789} =
  \num[round-precision = 3, round-mode = figures, scientific-notation = true]
    {123456789}$.

\end{document}

目前注意一些的内部结构siunitx仅限于“TeX 大小”的数字,但我目前正在开发下一个主要版本,这是需要处理的事情之一。目前的修复:

\documentclass{article}
\usepackage{siunitx,l3bigint}
\ExplSyntaxOn
\cs_set_protected:Npn
  \__siunitx_number_process_scientific_aux_ii:nnn #1#2#3 {
  \bigint_compare:nNnTF {#1} > { 9 }
    { \__siunitx_number_process_scientific_large:nnn {#1} {#2} {#3} }
    {
      \bigint_compare:nNnTF {#1} > { 0 }
        {
          \bool_if:NTF \l__siunitx_process_engineering_bool
            { \__siunitx_number_process_scientific_engineering:nnn }
            { \__siunitx_number_process_scientific_store:nnn }
               {#1} {#2} {#3}
        }
        {
          \__siunitx_number_process_scientific_small:wn
            #2 \q_stop {#3}
        }
    }
}
\cs_set_protected:Npn
  \__siunitx_number_process_scientific_large:nnn #1#2#3
  {
    \tl_set:Nx \l__siunitx_tmpa_tl
      { \bigint_div_truncate:nn {#1} { 10 } }
    \tl_set:Nx \l__siunitx_tmpb_tl
      { \bigint_mul:nn { \l__siunitx_tmpa_tl } { 10 } }
    \tl_set:Nx \l__siunitx_tmpb_tl
      { \bigint_sub:nn {#1} { \l__siunitx_tmpb_tl } }
    \tl_set:Nx \l__siunitx_tmpa_tl
      {
        { \l__siunitx_tmpa_tl } { \l__siunitx_tmpb_tl #2 }
        { #3 + 1 }
      }
  \exp_after:wN \__siunitx_number_process_scientific_aux_ii:nnn
    \l__siunitx_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
$\num{1234567890123456789} =
  \num[round-precision = 3, round-mode = figures, scientific-notation = true]
    {1234567890123456789}$.

\end{document}

答案3

这是一个使用 LuaLaTeX 的解决方案。有一个名为 的 TeX 端宏\tosci和一个名为 的 Lua 端函数。可以通过修改使用的tosci函数的第一个参数来选择显示的数字位数。string.formattosci

\tosci如果您喜欢这种外观,可以单独使用 的输出1.234e+09。要获得这种1.234 x 10^9外观,还有另一个名为 的 TeX 端宏\convert,它将\tosci宏嵌套在\num的宏中希尼奇包。注意:我使用该名称是\convert因为这是您在帖子中给出的名称;您可能想要想出一个更具描述性的名称。

另外:使用的一个好处\convert是,人们不必担心数字太大(即数字太多),因为当前版本的siunitx\num无法自行处理。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{luacode} % for 'luacode' environment and '\luastring' macro
\usepackage{siunitx} % for '\num' macro

% Lua-side code
\begin{luacode} 
   function tosci ( n ) 
      return ( string.format ( "%.3e", n ) ) -- show 3 digits after the decimal
   end
\end{luacode}

% TeX-side code
\newcommand{\tosci}[1]{%
    \directlua{tex.sprint ( tosci ( \luastring{#1} ) ) }}
\newcommand{\convert}[1]{\num{\tosci{#1}}}

\begin{document}
\tosci{123456789012}, \tosci{1234123412341234}

\convert{456745674567456745674}
\end{document}

答案4

您可以结合使用以下方法:

  1. 宏观\xintFloat [P]信特压裂P其精度要求任意,其输出形式为,有效数字<non zero digit>.<digit>...<digit>e<integer exponent>的总位数为,P
  2. 以及\numprint包的宏数字打印它会将这样的东西转换成可定制的形式,默认情况下类似于x.y \times 10^{exponent},将数字按三位分组,可能带有分隔符。

\xintFloat是可扩展的,只需要嵌套宏调用:

\numprint {\xintFloat [7]{123456789012345678901234567890}}
\numprint {\xintFloat [13]{123456789012345678901234567890}}

浮印

输入的数值\xintFloat不仅限于大整数,可以是科学数本身,例如6.02e23,也可以是没有科学指数的小数2627.72827,甚至可以是分子分母分别为上述类型的分数,也可以是大整数。例如1234567890/9876543210:(默认精度为16数字,最后一位四舍五入)。

\numprint {\xintFloat {1234567890/9876543210}}

浮动打印 2

源代码:

\documentclass{article}
\usepackage[english]{babel}
\usepackage{xintfrac}
\usepackage[autolanguage]{numprint}
\begin{document}

text mode (ttfamily):
\texttt{\numprint {\xintFloat [7]{123456789012345678901234567890}}} and
\texttt{\numprint {\xintFloat [13]{123456789012345678901234567890}}}

math mode:
$\numprint {\xintFloat [7]{123456789012345678901234567890}}$ and
$\numprint {\xintFloat [13]{123456789012345678901234567890}}$

\numprint {\xintFloat {1234567890/9876543210}}
\end{document}

相关内容