![ifthen 使用不同的格式数字](https://linux22.com/image/331319/ifthen%20%E4%BD%BF%E7%94%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E6%A0%BC%E5%BC%8F%E6%95%B0%E5%AD%97.png)
我想比较不同格式的数字,但没有得到期望的结果。
\documentclass[a4paper]{article}
\usepackage{ifthen}
\usepackage{numprint}
\npthousandsep{,}
\npdecimalsign{.}
\nprounddigits{2}
\newcommand{\dotnumber}{1200.00}
\newcommand{\nodotnumber}{1200}
\begin{document}
\ifthenelse{\equal{\numprint{\dotnumber}}{\numprint{\nodotnumber}}}{true}{false}\\
\numprint{\dotnumber}\\
\numprint{\nodotnumber}\\
\end{document}
那里有什么问题? 有什么方法可以让结果正确吗?
答案1
你不是在比较两个数字,而是在比较打印他们;所以测试无法成功。
expl3
这是及其浮点模块的工作。
\documentclass[a4paper]{article}
\usepackage{xparse}
\usepackage{numprint}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\numcompare}{O{=}mmmm}
{
\fp_compare:nTF { #2 #1 #3 } { #4 } { #5 }
}
\ExplSyntaxOff
\npthousandsep{,}
\npdecimalsign{.}
\nprounddigits{2}
\newcommand{\dotnumber}{1200.00}
\newcommand{\nodotnumber}{1200}
\begin{document}
\numcompare{\dotnumber}{\nodotnumber}{true}{false}
\numprint{\dotnumber}
\numprint{\nodotnumber}
Expected: true; true, true, false
\numcompare{1.2e2}{120}{true}{false};
\numcompare[>]{10}{9}{true}{false};
\numcompare[>=]{10}{10}{true}{false};
\numcompare[<]{10}{9}{true}{false}
\end{document}
该函数\fp_compare:nTF
对所提供的数字(和所提供的关系符号,如果不需要默认值)执行测试=
;数字的格式应符合 IEEE 浮点标准。
答案2
您可以分别对点之前的部分和点之后的部分进行测试。
编辑如果您需要进行其他测试(<
或>
,而不仅仅是=
),则必须使用宏重新计算“点后”部分\tnC
。此宏将零附加到总共九位数字。如果“点后”部分的数字超过九位,则其余部分将被忽略。因此,只能精确计算小数点后的九位数字。这是因为 TeX 中的最大整数约为 2*10^9。如果您需要更精确的计算,请使用\input apnum
或类似的。
\newif\iftestnumber
\def\testnumbers#1#2#3#4{%
\edef\tmpA{\expandafter\tnA#1.;}\edef\tmpB{\expandafter\tnA#3.;}%
\edef\tmpAA{\expandafter\tnAA#1.;}\edef\tmpBB{\expandafter\tnAA#3.;}%
\def\tmp{}\expandafter\tnC\tmpAA!;000000000!;\let\tmpAA=\tmp
\def\tmp{}\expandafter\tnC\tmpBB!;000000000!;\let\tmpBB=\tmp
\testnumberfalse
\ifx=#2\ifnum\tmpA=\tmpB\space \ifnum\tmpAA=\tmpBB\space \testnumbertrue\fi\fi
\else \ifnum\tmpA#2\tmpB\space \testnumbertrue
\else \ifnum\tmpA=\tmpB\space \ifnum\tmpAA#2\tmpBB\space \testnumbertrue
\fi \fi
\iftestnumber
}
\def\tnA#1.#2;{\ifx;#1;0\else#1\fi}
\def\tnAA#1.#2;{\ifx;#2;0\else \tnA#2;\fi}
\def\tnC#1#2;#3#4;{\ifx!#3\def\next##1;##2;{}\else
\ifx!#1\edef\tmp{\tmp#3}\def\next{\tnC!}%
\else\edef\tmp{\tmp#1}\let\next=\tnC\fi\fi
\next#2;#4;%
}
\def\dotnumber{1200.00}
\def\nodotnumber{1200}
\testnumbers \dotnumber=\nodotnumber \iftrue True\else False\fi
\testnumbers {2.009} < {2.012} \iftrue True\else False\fi
答案3
您可以使用维度:
\documentclass[a4paper]{article}
\usepackage{ifthen}
\usepackage{numprint}
\npthousandsep{,}
\npdecimalsign{.}
\nprounddigits{2}
\newcommand{\dotnumber}{1200.00}
\newcommand{\nodotnumber}{1200}
\begin{document}
\ifthenelse{\equal{\numprint{\dotnumber}}{\numprint{\nodotnumber}}}{true}{false}\\
\ifthenelse{\lengthtest{\dotnumber pt=\nodotnumber pt}}{true}{false}\\
\numprint{\dotnumber}\\
\numprint{\nodotnumber}\\
\end{document}