我想将大整数转换为较短的形式;例如
\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.format
tosci
\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
您可以结合使用以下方法:
宏\xintFloat
是可扩展的,只需要嵌套宏调用:
\numprint {\xintFloat [7]{123456789012345678901234567890}}
\numprint {\xintFloat [13]{123456789012345678901234567890}}
输入的数值\xintFloat
不仅限于大整数,可以是科学数本身,例如6.02e23
,也可以是没有科学指数的小数2627.72827
,甚至可以是分子分母分别为上述类型的分数,也可以是大整数。例如1234567890/9876543210
:(默认精度为16
数字,最后一位四舍五入)。
\numprint {\xintFloat {1234567890/9876543210}}
源代码:
\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}