如何将浮点数截断为任意小数位?

如何将浮点数截断为任意小数位?

是否有软件包提供命令,可以将浮点数截断为任意小数位,而不是最接近的整数?例如,2.59 截断到小数点后一位是 2.5(而圆形圆周率小数点后一位为 2.6),而圆周率小数点后三位为 3.141(而圆形到小数点后第三位为3.142)。

答案1

无需软件包,但您需要最新的 LaTeX 版本(从 2021 年 10 月开始)。

\documentclass{article}

\newcommand{\truncate}[2]{\fpeval{trunc(#1,#2)}}

\begin{document}

\truncate{pi}{0}

\truncate{pi}{2}

\truncate{exp(1)}{3}

\truncate{exp(sqrt(2))}{3}

\end{document}

在此处输入图片描述

答案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}

相关内容