ifthen 使用不同的格式数字

ifthen 使用不同的格式数字

我想比较不同格式的数字,但没有得到期望的结果。

\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}

在此处输入图片描述

相关内容