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

use*_*969 204 c#

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

Sim*_*her 206

bool positive = number > 0;
bool negative = number < 0;
Run Code Online (Sandbox Code Playgroud)

  • 那么可怜的老负零呢?! (17认同)
  • 根据定义,零不是正面的:http://en.wikipedia.org/wiki/0_(number) (6认同)
  • @SimonFischer绝对有数学,计算机科学和正规科学的分支,它们使用负零和正零。例如,化学家和物理学家有时会使用-0表示负数并且四舍五入为零。定义仅在上下文中具有含义。当您对待数学定义时,就好像它们是真正的普遍知识一样,您可能会冒入错误的另一数学环境中的风险。 (2认同)
  • 不敢相信我只是谷歌搜索。 (2认同)

tjm*_*tjm 173

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

num != 0   // num is positive *or* negative!
Run Code Online (Sandbox Code Playgroud)

  • 否,OP询问“是正还是负”不是“是(正还是负)” (4认同)
  • 0 仍为阳性 (2认同)

hun*_*ter 82

OVERKILL!

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在内部,它应该实例化一个使用`SignDeterminatorFactory`实现`ISignDeterminator`的类. (25认同)
  • 不完整:你也应该检查IsNaN();) (10认同)
  • @slashmais:关于`int` ?! 你工作的是什么神奇的C#? (3认同)
  • 您还可以使用 System.Data.OracleClient 连接到 Oracle 数据库并执行 PL/SQL 以确定数字是否为负数。 (3认同)
  • 对于.NET 4.0,您应该添加`IsImaginary`. (2认同)
  • 您应该在代码中添加<summary>注释,使其变得更可靠,一致,体面,可访问,稳定,健壮,可靠,安全和清晰. (2认同)

gno*_*ice 58

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

  • @AndyC:我很喜欢这种幽默,但他应该与`Math.Sign`的返回值进行相等比较(因为它明确定义了可能的返回值.) (3认同)

Lou*_*nco 56

num < 0 // number is negative
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是一个初学者,我们应该尽力帮助.一旦你学会了正确的方法 - 检查错误的方法http://thedailywtf.com/Articles/When_(n_0x3c_0)_won_0x27_t_do_0x2e_.aspx (12认同)

por*_*ast 25

这是行业标准:

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

  • 我试了一下.我的程序最终失去了内存.您的代码可能存在泄漏吗? (5认同)
  • @Will,很好地发现了这个非常模糊的漏洞!虽然我不赞成你改变原始海报的介绍性句子的含义.我仍然认为将其称为行业标准是正确的.因此,为了保持这个答案的精神,并对原始海报,我已经恢复你的编辑,好吗? (4认同)
  • @Will,我真的需要说明关于原始帖子和我的评论的明显内容吗?(掠夺者:它与讽刺有关,而你的讽刺却没有,这意味着你已经杀死了这里存在不好的笑话 - 或者你是否真的认为这个答案本应该被认真对待?) (4认同)
  • 我很认真地对待这件事;讽刺并不明显,这会让新用户和非母语人士感到困惑。如果这不是一个严肃的答案,我将恢复我的编辑并将其标记为不是答案。 (2认同)
  • 在那里,我们去,恢复,标记和downvoted.我不知道这是个玩笑. (2认同)

Pow*_*ord 19

你的年轻人和你的幻想少于标志.

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

  • 这段代码是否适用于*all*signed整数? (4认同)
  • @Eric:不,因为如果`num`是`MinValue`,无论传入什么类型(`Int16`,`Int32`,`Int64`),它都会抛出一个`OverflowException`.浮点值的结果甚至更糟,因为它们也可能是"NaN",因为"NaN!= NaN". (2认同)

Igo*_*hko 10

    public static bool IsPositive<T>(T value)
        where T : struct, IComparable<T>
    {
        return value.CompareTo(default(T)) > 0;
    }
Run Code Online (Sandbox Code Playgroud)


Pol*_*ial 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;
}
Run Code Online (Sandbox Code Playgroud)

不要使用它.

  • "不要用这个"?但它是企业级代码,非常适合企业软件!但是你缺少`IsPositiveChecker`,`IsPositiveCheckerInterface`,`IsPositiveCheckerFactory`和`IsPositiveCheckerFactoryInterface`. (8认同)

Bar*_*der 6

if (num < 0) {
  //negative
}
if (num > 0) {
  //positive
}
if (num == 0) {
  //neither positive or negative,
}
Run Code Online (Sandbox Code Playgroud)

或使用"else ifs"


Dre*_*kes 6

对于32位有符号整数,例如System.Int32,int在C#中:

bool isNegative = (num & (1 << 31)) != 0;
Run Code Online (Sandbox Code Playgroud)


jer*_*ome 5

public static bool IsNegative<T>(T value)
   where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) < 0;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

您只需要比较值及其绝对值是否相等:

if (value == Math.abs(value))
    return "Positif"
else return "Negatif"
Run Code Online (Sandbox Code Playgroud)


gbe*_*ger 5

bool isNegative(int n) {
  int i;
  for (i = 0; i <= Int32.MaxValue; i++) {
    if (n == i) 
      return false;
  }
  return true;
}
Run Code Online (Sandbox Code Playgroud)