我正在制作一个图表,而且我对 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