是否有软件包提供命令,可以将浮点数截断为任意小数位,而不是最接近的整数?例如,2.59 截断到小数点后一位是 2.5(而圆形圆周率小数点后一位为 2.6),而圆周率小数点后三位为 3.141(而圆形到小数点后第三位为3.142)。
答案1
答案2
无包裹。
\documentclass{article}
\newcommand\truncate[2]{\truncrep{#1}#2\relax}
\def\truncrep#1#2.#3#4\relax{%
\ifx\relax#2\relax\else#2.\fi
\ifnum#1>0 #3\expandafter\truncrep\expandafter
{\the\numexpr#1-1}.#40\relax\fi
}
\begin{document}
\truncate{0}{10.347}
\truncate{1}{10.347}
\truncate{2}{10.347}
\truncate{3}{10.347}
\truncate{4}{10.347}
\truncate{5}{10.347}
\end{document}
答案3
这是一个基于 LuaLaTeX 的解决方案。它不需要任何外部包。
LaTeX 宏\truncate
接受两个参数。
根据 Lua 的语法规则,第一个参数应该是一个数字或计算结果为一个数字,可能带有小数部分。
第二个参数应该是一个整数。
- 如果该整数等于 0,则第一个参数的纯整数部分(没有返回小数点
- 否则,第一个参数将被截断为规定的位数。第二个参数可以是负数;例如,
\truncate{150,-2}
返回100
。
% !TEX TS-program = lualatex
\documentclass{article}
\directlua{ % define a Lua function that does most of the work
function xtrunc ( s , numdigits )
if numdigits == 0 then
return ( math.floor ( s ) )
else
s = math.floor ( s*10^numdigits ) / 10^numdigits
if numdigits>0 then
return s
else
return math.floor ( s ) % remove decimal marker
end
end
end
}
\newcommand\truncate[2]{\directlua{
if #1 >= 0 then tex.sprint ( xtrunc ( #1 , #2 ) )
else tex.sprint ( -xtrunc ( -(#1) , #2 ) )
end
}}
\begin{document}
\truncate{math.pi}{2},
\truncate{math.exp(1)}{5},
\truncate{1.73205}{1},
\truncate{1.73205}{0}
\end{document}