Як я можу перевірити, чи число позитивне чи негативне в C #?


206

Як я можу перевірити, чи число позитивне чи негативне в C #?

Відповіді:


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

18
А як же поганий старий негативний нуль ?!
Грант Крофтон

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

177

Звичайно, ніхто не дав правильної відповіді,

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

4
ні, ОП запитав, чи is positive or is negativeніis (positive or negative)
Т.Тодуа

0 все ще позитивно
Джуд Баутіста,

@ 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

3
@slashmais: На int?! У якій магічній країні C # ти працюєш?
Jeff Yates

2
Для .NET 4.0 слід додати IsImaginary.
Райан Лунді

2
Ви повинні додати <summary> коментар у свій код, щоб він став більш надійним, послідовним, пристойним, доступним, стабільним, надійним, міцним, безпечним та зрозумілим.
Мемет Олсен

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/Articles/…
Лу Франко

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.
Powerlord


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

або використовувати "else ifs"


6

Для 32-бітного цілого числа, підписаного, наприклад System.Int32, aka 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.