代码:
\documentclass{article}
\usepackage[a4paper]{geometry}
\usepackage[english]{babel}
\usepackage{fp}
\def\x{59.3612}
\begin{document}
\noindent
x = \x\\
%what to write here?
int(x) = 59\\
frac(x) = 3612
\end{document}
我应该调用什么函数才能从 \x 中获取 59 和 3612?
答案1
xint
软件包开发者的说明:文档不够清晰
\xintDecSplitR
,整数唯一的宏(实际上它主要在内部使用,但不知为何我给了它一个公共接口)。因此,虚假的点是使用宏处理意外输入的后遗症。如果我在内部以其他方式编码,它可能是虚假的!
或虚假的;
。幸运的是,这个点确实可以通过 删除\xintNum
。因此我建议使用 egreg 的方法,因为这个是出于偶然原因而工作的。
xint
同时实现了小数和分数,并且缺少实用程序,这只对定点数有意义。因此,这里没有针对所问问题的高级一次性接口。
以下是一种实现此操作的方法xint
:
\documentclass{article}
\usepackage{xintexpr}
\def\x{59.3612}
\newcommand{\getint}[1]{\xintNum{#1}\relax}
\newcommand{\getdec}[1]{\xintNum{\xintDecSplitR{0}{#1}}\relax}
\begin{document}
The integer part: \xintNum{\x}\relax % Or just \getint{\x}
The decimal part: \xintNum{\xintDecSplitR{0}{\x}}\relax % Or just \getdec{\x}
\end{document}
据我所知包装文档:
\xintNum{x}
截断小数x
并返回整数值。
\xintDecSplit{n}{x}
将数字x
切成两部分并返回两个浮点数。如果n
为 0,则在小数点处进行拆分。相应的命令\xintDecSplitR{n}{x}
返回切割后右侧的数字,在本例中为 的小数部分x
。我不得不将其包装在其自身中\xintNum
以将浮点数转换为整数,这样您就不会在末尾得到虚假的点。
最后,可以将整个表达式包装在您自己的自定义命令中,就像我所做的那样\getint
,\getdec
这样它就不会使您的主代码变得混乱。
答案2
只需在句点处分割输入。
\documentclass{article}
\makeatletter
\newcommand{\intpart}[1]{\expandafter\int@part#1..\@nil}
\def\int@part#1.#2.#3\@nil{\if\relax#1\relax0\else#1\fi}
\newcommand{\fracpart}[1]{\expandafter\frac@part#1..\@nil}
\def\frac@part#1.#2.#3\@nil{\if\relax#2\relax0\else#2\fi}
\makeatother
\begin{document}
59.3612: integral part \intpart{59.3612}, fractional part \fracpart{59.3612}
\def\x{59.3612}
\x: integral part \intpart\x, fractional part \fracpart\x
\def\x{42}
\x: integral part \intpart\x, fractional part \fracpart\x
\def\x{.3}
\x: integral part \intpart\x, fractional part \fracpart\x
\end{document}