2010-11-04 12 views

risposta

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

Devo essere molto, molto, molto stanco! Mi fa ridere come ridicolo la mia domanda era – user9969

+11

Abbiamo tutti i nostri momenti :-) –

+14

E il povero vecchio zero negativo ?! –

54
num < 0 // number is negative 
+12

Suppongo che questo sia un principiante, che dovremmo cercare di aiutare. Una volta che hai imparato la strada giusta, verifica questo in modo errato http://thedailywtf.com/Articles/When_(n_0x3c_0)_won_0x27_t_do_0x2e_.aspx –

+1

all'inizio non potevo credere alla domanda nella pagina principale, poi sono venuto qui ... :) e questo ragazzo non è solo ... oh caro :) – slashmais

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

o utilizzare "altro se"

+1

Haha. "O positivo o negativo". –

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

Sto pensando di refactoring questo con alcuni delegati ... – hunter

+23

Internamente, dovrebbe istanziare una classe che implementa 'ISignDeterminator' usando un' SignDeterminatorFactory'. –

+10

Incompleto: dovresti controllare anche IsNaN();) – slashmais

18

Voi giovani e i vostri segni di fantasia.

Nel mio giorno abbiamo dovuto usare Math.abs(num) != num //number is negative!

+0

(Se non era ovvio, questo era inteso per essere umoristico) – Powerlord

+3

Questo codice funziona per * tutti * interi con segno ? –

+2

@Eric: No, perché getterà un 'OverflowException' se' num' è 'MinValue' per qualunque tipo venga passato (' Int16', 'Int32',' Int64'). I risultati sono anche peggiori per i valori in virgola mobile, dove potrebbero anche essere 'NaN', dal momento che' NaN! = NaN'. – Powerlord

46

Il Math.Sign method è un modo per andare. Restituirà -1 per i numeri negativi, 1 per i numeri positivi e 0 per i valori pari a zero (vale a dire zero non ha alcun segno). Le variabili di precisione doppie e singole causeranno un'eccezione (ArithmeticException) da lanciare se sono uguali a NaN.

+0

Wow non sapeva che questo esiste. Cosa succede per NaN? – Tanmoy

+0

@Tanmoy: Sembra che lancerà [un'eccezione] (http://msdn.microsoft.com/en-us/library/system.arithmeticexception.aspx) in questo caso. – gnovice

+0

interessante ... impara qualcosa di nuovo ogni giorno. –

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

Per un intero con segno a 32 bit, come ad esempio System.Int32, alias int in C#:

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

Naturalmente nessuno è in realtà dato la risposta corretta,

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

ah. Hahaha. mi ci sono voluti alcuni minuti per capire che questa è la risposta corretta: 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

Devi solo confrontare se il valore & suo valore assoluto sono uguali: versione

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

Questa tecnica è già coperta da http://stackoverflow.com/a/4099428/497043 –

7

nativa del programmatore. Il comportamento è corretto per i sistemi little-endian.

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

Non usarlo mai.

+7

"Non usarlo mai"? Ma è un codice di qualità aziendale, perfetto per i software aziendali! Mancano 'IsPositiveChecker',' IsPositiveCheckerInterface', 'IsPositiveCheckerFactory' e' IsPositiveCheckerFactoryInterface', comunque. –

+0

Utilizzato solo questo nella mia app della console Hello World. 10/10 lo farei di nuovo. – VSG24

21

Questo è lo standard del settore:

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

Questo non è C# anche se – Episodex

+2

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

+0

Ehi! Questo è @BrunoKim :) –

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

Questo codice sfrutta le istruzioni SIMD per migliorare le prestazioni.

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