如何检查C#中的数字是正数还是负数?


206

如何检查C#中的数字是正数还是负数?

Answers:


210
bool positive = number > 0;
bool negative = number < 0;

18
可怜的旧负零呢?
Grant Crofton

3
@SimonFischer肯定有数学,计算机科学和正规科学的分支,它们使用负零和正零。例如,化学家和物理学家有时会使用-0来表示负数并四舍五入为零。定义仅在上下文中具有含义。当您对待数学定义时,就好像它们是真正的普遍知识一样,您可能会冒入错误的另一数学上下文中的风险。
VoronoiPotato

177

当然,没有人会给出正确的答案,

num != 0   // num is positive *or* negative!

4
没有,OP问,如果 is positive or is negative不是is (positive or negative)
T.Todua

0仍然是正面的
Jude Bautista

@ T.Todua我相信那是个玩笑。
NetherGranite

83

过量杀!

public static class AwesomeExtensions
{
    public static bool IsPositive(this int number)
    {
        return number > 0;
    }

    public static bool IsNegative(this int number)
    {
        return number < 0;
    }

    public static bool IsZero(this int number)
    {
        return number == 0;
    }

    public static bool IsAwesome(this int number)
    {
        return IsNegative(number) && IsPositive(number) && IsZero(number);
    }
}

27
在内部,它应实例化ISignDeterminator使用实现的类SignDeterminatorFactory
Jesse C. Slicer

10
不完整:您也应检查IsNaN();)
slashmais 2010年

3
@slashmais:在int?您在C#的哪个神奇领域工作?
杰夫·耶茨

2
对于.NET 4.0,您应该添加IsImaginary
瑞安·伦迪

2
您应该在代码中添加<summary>注释,以使其变得更加可靠,一致,体面,可访问,稳定,健壮,可靠,安全和清晰。
Memet Olsen 2015年

59

Math.Sign方法是一条路可走。负数将返回-1,正数将返回1,等于零的值将返回0(即零没有符号)。如果双精度和单精度变量等于NaN,则将引发异常(ArithmeticException)。


哇,不知道这存在。NaN会发生什么?
Tanmoy

@Tanmoy:在这种情况下,它将抛出异常
gnovice

1
但是然后他必须检查Math.Sign的结果是正还是负!他也使用Math.Sign吗?;)
AndrewC

3
@AndyC:我很幽默,但是他应该对返回值进行相等比较Math.Sign(因为它明确定义了可能的返回值。)
Rob

我没想到在这个问题下面找到有用的答案,但这实际上是我想要的。谢谢。
Paul


25

这是行业标准:

int is_negative(float num)
{
  char *p = (char*) malloc(20);
  sprintf(p, "%f", num);
  return p[0] == '-';
}

不过这不是C#
Episodex

5
我尝试了。我的程序最终内存不足。您的代码可能会泄漏吗?
Thomas Tempelmann

4
@Will,发现了这个非常晦涩的泄漏,做得很好!尽管我不赞成您更改原始海报介绍性句子的含义。我仍然认为将其称为行业标准是正确的。因此,为了与这个答案的精神保持一致,并针对原始海报,我恢复了您的编辑,好吗?
Thomas Tempelmann '16

4
@Will,我真的需要说明有关原始帖子和我的评论的明显之处吗?(剧透:这与讽刺有关,而与您无关,这意味着您已经杀了这里存在不良的笑话,或者您是否真的认为应该认真对待这个答案?)
Thomas Tempelmann

2
我们去了,还原,标记和拒绝投票。我不知道这是个玩笑。
威尔

19

你年轻,你想不到的迹象。

回到我的一天,我们不得不使用Math.abs(num) != num //number is negative


(如果不是很明显,那是为了幽默)
Powerlord

2
@Eric:没有,因为它会抛出一个OverflowException如果numMinValue任何类型中通过了(Int16Int32Int64)。对于浮点值,结果甚至更糟NaN,因为NaN != NaN
Powerlord 2010年


9

本机程序员的版本。行为对于小端系统是正确的。

bool IsPositive(int number)
{
   bool result = false;
   IntPtr memory = IntPtr.Zero;
   try
   {
       memory = Marshal.AllocHGlobal(4);
       if (memory == IntPtr.Zero)
           throw new OutOfMemoryException();

       Marshal.WriteInt32(memory, number);

       result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;
   }
   finally
   {
       if (memory != IntPtr.Zero)
           Marshal.FreeHGlobal(memory);
   }
   return result;
}

永远不要使用它。


9
“永远不要使用此”?但这是企业质量的代码,非常适合企业软件!你错过了IsPositiveCheckerIsPositiveCheckerInterfaceIsPositiveCheckerFactory,和IsPositiveCheckerFactoryInterface,虽然。
TimČas2015年

1
刚在我的Hello World控制台应用程序中使用过此功能。10/10会再做一次。
Vahid Amiri

您遗漏了一组括号,因为'&'的优先级低于'==',因此您应该拥有result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;。另外,您应该return result;在末尾有一个地方,以便它实际上会返回结果。
Dragonrage

6
if (num < 0) {
  //negative
}
if (num > 0) {
  //positive
}
if (num == 0) {
  //neither positive or negative,
}

或使用“否则”



5
public static bool IsNegative<T>(T value)
   where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) < 0;
}


5
bool isNegative(int n) {
  int i;
  for (i = 0; i <= Int32.MaxValue; i++) {
    if (n == i) 
      return false;
  }
  return true;
}

3
int j = num * -1;

if (j - num  == j)
{
     // Num is equal to zero
}
else if (j < i)
{
      // Num is positive
}
else if (j > i) 
{
     // Num is negative
}

1

此代码利用SIMD指令来提高性能。

public static bool IsPositive(int n)
{
  var v = new Vector<int>(n);
  var result = Vector.GreaterThanAll(v, Vector<int>.Zero);
  return result;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.