2010-11-04 6 views

ответ

173
bool positive = number > 0; 
bool negative = number < 0; 
+76

Я, должно быть, очень очень устал! заставляет меня смеяться, как смешно мой вопрос был – user9969

+11

У всех нас есть свои моменты :-) –

+14

А как насчет бедного старого отрицательного нуля ?! –

54
num < 0 // number is negative 
+12

Я предполагаю, что это новичок, с которым мы должны попытаться помочь. Как только вы узнаете правильный путь - проверьте это по-другому. Http://thedailywtf.com/Articles/When_(n_0x3c_0)_won_0x27_t_do_0x2e_.aspx –

+1

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

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

или использовать "Else если"

+1

Ха-ха. «Либо положительный, либо отрицательный». – 2010-11-05 06:45:11

77

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

Я думаю о реорганизации этого с некоторыми делегатами ... – hunter

+23

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

+10

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

18

Вы, молодые люди, и ваши причуды менее, чем знаки.

В свое время нам пришлось использовать Math.abs(num) != num //number is negative!

+0

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

+3

Работает ли этот код для * всех * целых чисел со знаком ? –

+2

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

46

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

+0

Wow не знал, что это существует. Что происходит для NaN? – Tanmoy

+0

@Tanmoy: Похоже, что в этом случае будет выбрано [исключение] (http://msdn.microsoft.com/en-us/library/system.arithmeticexception.aspx). – gnovice

+0

интересно ... узнать что-то новое каждый день. –

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

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

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

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

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

ах. хахаха. взял меня на несколько минут, чтобы понять, что это правильный ответ: D – VOX

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

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

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

Этот метод уже покрыт http://stackoverflow.com/a/4099428/497043 –

7

Native программиста. Поведение корректно для малочисленных систем.

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

Никогда не используйте это.

+7

«Никогда не используйте это»? Но это код корпоративного качества, идеально подходящий для корпоративного программного обеспечения! Тем не менее, вы пропускаете 'IsPositiveChecker',' IsPositiveCheckerInterface', 'IsPositiveCheckerFactory' и' IsPositiveCheckerFactoryInterface'. –

+0

Просто использовал это в моем приложении Hello World. 10/10 сделает это снова. – VSG24

21

Это промышленный стандарт:

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

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

+2

https://twitter.com/MarcosBL/status/641110424193232897 –

+0

Эй! Thats me @BrunoKim :) –

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

Этот код использует инструкции SIMD для повышения производительности.

public static bool IsPositive(int n) 
{ 
    var v = new Vector<int>(n); 
    var result = Vector.GreaterThanAll(v, Vector<int>.Zero); 
    return result; 
} 
Смежные вопросы