如何测试一个数字是否为负数

如何测试一个数字是否为负数

有没有简单的方法来测试一个数字是否为负数?

我不需要通用解决方案,但它确实需要能够处理浮点值。我用的是这个TeX FAQ 中的解决方案直到我意识到它对正浮点数有问题。这是一个测试文件

\documentclass{article}

\def\IsPositive#1{%
  TT\fi%
  \ifcat_\ifnum0<0#1 _\else A\fi%
}

\newcommand{\PrintSignOfNumber}[1]{%
    \if\IsPositive{#1}%
        $#1 \ge 0$%
    \else%
        $#1 < 0$%
    \fi%
}

\begin{document}

\PrintSignOfNumber{2}\par 
\PrintSignOfNumber{-2}

\PrintSignOfNumber{2.0}\par  % reported as negative
\PrintSignOfNumber{-2.0}

\end{document}

我不需要非常通用的解决方案。即使它只是测试第一个字符为负号,对我的应用程序来说也足够了。我认为可以etoolbox轻松做到这一点,但我不知道该怎么做。如果有人知道一份包含使用示例的好文档,etoolbox那就太好了。

答案1

如果您是 TikZ 的熟练者,那么下一个解决方案适合您(使用 pgf 2.1)

\documentclass[]{scrartcl}
\usepackage{tikz}
\newcommand\test[1]{
\pgfmathsetmacro{\var}{#1}
\pgfmathparse{ifthenelse(\var>=0,"positif","négatif")} \pgfmathresult}%

\begin{document} 

\test{1}   \test{-2} \test{cos(95)}

\end{document}

修改版本:

\documentclass[]{scrartcl}
\usepackage{tikz}

\newcommand\ifPositif[3]{ 
\begingroup
\pgfmathsetmacro{\var}{#1}
\pgfmathparse{ifthenelse(\var>=0,1,0)} 
\ifdim\pgfmathresult pt= 1 pt 
   #2
  \else 
   #3
\fi 
\endgroup
}

\begin{document}

\ifPositif{1}{pos}{neg} 

\ifPositif{2-2}{\pgfmathparse{sqrt(3)} \pgfmathresult}
                {\pgfmathparse{sqrt(2)} \pgfmathresult} 

\ifPositif{cos(95)+sqrt(2)}{\pgfmathparse{sqrt(5)} \pgfmathresult}
                            {\pgfmathparse{sqrt(6)} \pgfmathresult}

\ifPositif{-1e-2}{pos}{neg}

\ifPositif{1-5e2}{\var}{\foreach \x in {1,2}{\x}} 

\ifPositif{1-5e2}{\var}{\var}   
\end{document}

答案2

\documentclass{article}

\makeatletter
\newcommand\PrintSignOfNumber[1]{%
  \ifdim#1pt<\z@ $#1<0$\else$#1\ge0$\fi}
\makeatother

\begin{document}

\PrintSignOfNumber{2}\par 
\PrintSignOfNumber{-2}

\PrintSignOfNumber{2.0}\par 
\PrintSignOfNumber{-2.0}

\end{document}

答案3

一个简单的方法是使用一个简单的宏并测试数字是否小于零。

\documentclass{article}
\begin{document}

\def\test#1{%
\expandafter\ifnum#1<0 isNegative \else isPositive\fi
}
\test{-23}

\test{23}
\end{document}

对于十进制数,修改为:

\documentclass{article}
\usepackage{fp}
\begin{document}

\def\test#1{%
\expandafter\ifnum#1<0 isNegative \else isPositive\fi
}
\test{-23}

\test{23}

\def\testReal#1{%
\FPiflt{#1}{0} isNegative\else isPositive\fi 
}

\testReal{-23.789}
\end{document}

答案4

虽然很晚才加入,但这是一个通用的解决方案存在。

\documentclass{article}
\usepackage{xfp}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\FPCompareTF}{mmm}
 {
  \fp_compare:nTF { #1 } { #2 } { #3 }
 }

\ExplSyntaxOff

\newcommand{\PrintSignOfNumber}[1]{%
  \FPCompareTF{#1 >= 0}{$\fpeval{#1}\ge0$}{$\fpeval{#1}<0$}%
}

\begin{document}

\PrintSignOfNumber{0}\par
\PrintSignOfNumber{2}\par
\PrintSignOfNumber{2.0}\par
\PrintSignOfNumber{-2.37}\par
\PrintSignOfNumber{22/7-pi}\par
\PrintSignOfNumber{3+10/71-pi}\par

\edef\pson{\FPCompareTF{3+10/71-pi>0}{positive}{negative}}
\texttt{\meaning\pson}

\end{document}

在此处输入图片描述

相关内容