如何在 LaTeX 中进行除法而不进行四舍五入或截断?

如何在 LaTeX 中进行除法而不进行四舍五入或截断?

我正在制作一个图表,而且我对 LaTeX 还不太熟悉,所以我决定尝试使用数学而不是静态分配的值来完成它。我想出了以下方法:

\newcommand\qoffset{14}
\newcommand\smallx{8}
\newcommand\smally{4}
\newcommand\py{\the\numexpr\smally * (\qoffset / (\qoffset - \smallx))}
\the\numexpr\qoffset / (\qoffset - \smallx)

答案应该是 9.3,\py但除法是四舍五入(或截断)的,我需要小数点精度。我该怎么做呢?

注意:我并非一定要使用\the\numexpr,这只是我在尝试弄清楚如何做数学时发现的。

答案1

\numexpr仅适用于整数。如果您想要小数,则必须使用\dimexpr(请注意,您必须将pt单位添加到分子):

\documentclass{article}
\makeatletter
\def\dimeval#1{\strip@pt\dimexpr#1\relax}
\makeatother
\begin{document}
\newcommand\qoffset{14}
\newcommand\smallx{8}
\newcommand\smally{4}
\dimeval{\qoffset pt / (\qoffset - \smallx)}

\dimeval{\smally pt * (\qoffset / (\qoffset - \smallx))}
\end{document}

结果是:

在此处输入图片描述

对于第一个来说是正确的,但对于第二个来说却不正确(应该是9.33333)。

第二个是错误的(取决于你的观点),因为\dimexpr只进行整数除法和乘法,所以(替换值)4pt * ( 14 / ( 14 - 8 ) )计算为4pt * ( 14 / 6 )然后为4pt * 2.33333,并2.33333截断为2,结果是8。你可以用更接近

\dimeval{\smally pt * \dimeval{\qoffset pt / (\qoffset - \smallx)}}

但错一点就是错的。


如果你想真实的浮点运算(无需担心单位),使用包\fpeval中的xfp

\documentclass{article}
\usepackage{xfp}
\begin{document}
\newcommand\qoffset{14}
\newcommand\smallx{8}
\newcommand\smally{4}
\fpeval{\qoffset / (\qoffset - \smallx)}

\fpeval{\smally * (\qoffset / (\qoffset - \smallx))}
\end{document}

结果

在此处输入图片描述


正如 Mico 所说,您可能需要四舍五入。如果要排版数字,最好的选择是包siunitx

\documentclass{article}
\usepackage{xfp}
\usepackage{siunitx}
\begin{document}
\num[round-mode=places, round-precision=5]%
  {\fpeval{4 * (14 / (14 - 8))}}
\end{document}

在此处输入图片描述

但是如果您想对进一步的计算进行四舍五入,那么您可以round直接使用该函数(语法是round(<num>,<digits>)):

\documentclass{article}
\usepackage{xfp}
\begin{document}
\fpeval{round(  4 * (14 / (14 - 8))  ,5)}
\end{document}

在此处输入图片描述

答案2

你会考虑使用 LuaTeX 吗?然后你可以计算更复杂的表达式:

% gobble ".0" for integers and rounding function
\begingroup
\catcode`\%=12
\directlua{
   function math.round_int ( x )
     return x>=0 and math.floor(x+0.5) or math.ceil(x-0.5)
   end
   function math.round ( x , n )
     return math.round_int ( x*10^n ) / 10^n 
   end
   function gobblezero(x)
     local y = math.round ( x , 8 )
     if y == math.floor(y) then
       return string.format ( "%.0f", y )
     else
       return math.round(y, 7)
     end
   end}
\endgroup

\def\fpeval#1{\directlua{tex.print(gobblezero(#1))}}

$$ \root 6 \of {64} = \fpeval{64^(1/6)} $$

With rounding:
%
$$ 1/3 = \fpeval{math.round(1/3, 1)}... $$

\bye

在此处输入图片描述

相关内容