Как проверить, является ли число положительным или отрицательным в C #?


206

Как проверить, является ли число положительным или отрицательным в C #?

Ответы:


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

18
Как насчет старого плохого отрицательного нуля ?!
Грант Крофтон

3
@SimonFischer Определенно есть отрасли математики, информатики, а также обычные науки, которые используют отрицательный и положительный ноль. Например, химики и физики иногда используют -0 для числа, которое было отрицательным и округлено до нуля. Определения имеют значение только в контексте. Когда вы рассматриваете математические определения, которым вас учили, как будто они действительно универсальны, вы рискуете оказаться в другом математическом контексте, где вы ошибаетесь.
ВоронойПотато

177

Конечно, никто не получил правильный ответ,

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

4
нет, ОП спросила, если is positive or is negativeнетis (positive or negative)
Т.Тодуа

0 по-прежнему положительно
Джуд Баутиста

@ T.Todua Я думаю, это была шутка.
NetherGranite

83

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);
    }
}

27
Внутренне это должно создать экземпляр класса, который реализует ISignDeterminatorиспользование SignDeterminatorFactory.
Джесси С. Slicer

10
Incomplete: вы должны проверить также IsNaN ();)
slashmais

3
@slashmais: На int?! В какой волшебной стране C # ты работаешь?
Джефф Йейтс

2
Для .NET 4.0 вы должны добавить IsImaginary.
Райан Ланди

2
Вы должны добавить комментарий в свой код, чтобы он стал более надежным, последовательным, достойным, доступным, стабильным, надежным, надежным, безопасным и понятным.
Мемет Олсен

59

Метод Math.Sign - это один из способов. Он вернет -1 для отрицательных чисел, 1 для положительных чисел и 0 для значений, равных нулю (т. Е. Ноль не имеет знака). Переменные двойной и одинарной точности будут вызывать исключение ( ArithmeticException ), если они равны NaN.


Ничего себе не знал, что это существует. Что происходит с NaN?
Танмой

@Tanmoy: похоже, в этом случае возникнет исключение .
gnovice

1
Но затем он должен проверить, положительный или отрицательный результат Math.Sign тоже! Он также использует Math.Sign для этого? ;)
AndrewC

3
@AndyC: Мне понравился юмор, но он должен делать сравнение на равенство с возвращаемым значением Math.Sign(поскольку оно явно определяет возможные возвращаемые значения.)
Роб

Я не ожидал найти полезный ответ под этим вопросом, но на самом деле это то, что я искал. Спасибо.
Пол

56
num < 0 // number is negative

12
Я предполагаю, что это новичок, которому мы должны попытаться помочь. Как только вы выучите правильный путь - проверьте это на неправильный путь thedailywtf.com/Article/…
Лу Франко

1
сначала я не мог поверить в вопрос на главной странице, потом я пришел сюда ... :) и этот парень не одинок ... о дорогой :)
slashmais

25

Это отраслевой стандарт:

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

Это не C #, хотя
Episodex

5
Я попробовал это. В моей программе не хватило памяти. Может ли быть утечка в вашем коде?
Томас Темпельманн

4
@ Хорошо, молодец, что заметил эту очень непонятную утечку! Хотя я нахмурился, что ты изменил значение вступительного предложения оригинального плаката. Я все еще верю, что правильно называть это отраслевым стандартом. Следовательно, чтобы соответствовать духу этого ответа и по отношению к оригинальному постеру, я отменил ваши изменения, хорошо?
Томас Темпельманн

4
@ Хочу ли я заявить об очевидном исходном сообщении и моих комментариях, которые получили положительные отзывы, а ваши нет? (Спойлер: это связано с сарказмом, а ваш - нет, что означает, что вы убили шутку о том, что здесь плохо существовало - или вы действительно думаете, что этот ответ должен был восприниматься всерьез ??)
Томас Темпельманн

2
Там мы идем, откат, помечены и понижен. Я не знал, что это была шутка.
Будет ли

19

Вы молодые и ваши фантазии менее чем знаки.

Назад в мой день мы должны были использовать Math.abs(num) != num //number is negative!


(Если это не было очевидно, это было предназначено, чтобы быть юмором)
Powerlord

2
@Eric: Нет, потому что она будет бросаться , OverflowExceptionесли numэто MinValueдля любого типа передается в ( Int16, Int32, Int64). Результаты еще хуже для значений с плавающей точкой, где они также могут быть NaN, так как NaN != NaN.
властелин


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
"Никогда не используйте это"? Но это код корпоративного качества, идеально подходящий для корпоративного программного обеспечения! Вы упускаете IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, и IsPositiveCheckerFactoryInterface, хотя.
Тим Час

1
Просто использовал это в моем консольном приложении Hello World. 10/10 сделает это снова.
Вахид Амири

вы пропускаете набор скобок, так как '&' имеет более низкий приоритет, чем '==', поэтому вы должны иметь 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,
}

или используйте «иначе, если»


6

Для 32-разрядного целого числа со знаком, такого как System.Int32aka intв C #:

bool isNegative = (num & (1 << 31)) != 0;

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

5

Вам просто нужно сравнить, если значение и его абсолютное значение равны:

if (value == Math.abs(value))
    return "Positif"
else return "Negatif"

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

0

Первый параметр сохраняется в регистре EAX, а также результат.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.