Come posso verificare se un numero è positivo o negativo in C #?


206

Come posso verificare se un numero è positivo o negativo in C #?

Risposte:


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

18
Che dire del povero vecchio zero negativo ?!
Concedi Crofton il

3
@SimonFischer Ci sono sicuramente branche della matematica, dell'informatica e anche della scienza regolare che usano uno zero negativo e positivo. Chimici e fisici, ad esempio, a volte useranno -0 per un numero negativo e arrotondato a zero. Le definizioni hanno significato solo all'interno di un contesto. Quando tratti le definizioni matematiche che ti sono state insegnate come se fossero veramente universali, rischi di finire in un diverso contesto matematico in cui ti sbagli.
VoronoiPotato,

177

Ovviamente a nessuno è stata data la risposta corretta,

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

4
no, OP ha chiesto se is positive or is negativenonis (positive or negative)
T.Todua

0 ancora positivo
Jude Bautista,

@ T.Todua Credo che fosse uno scherzo.
NetherGranite,

83

ECCESSIVO!

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
Internamente, dovrebbe istanziare una classe che implementa ISignDeterminatorusando a SignDeterminatorFactory.
Jesse C. Slicer,

10
Incompleto: dovresti verificare anche IsNaN ();)
slashmais

3
@slashmais: On an int?! In quale terra magica di C # stai lavorando?
Jeff Yates,

2
Per .NET 4.0 è necessario aggiungere IsImaginary.
Ryan Lundy,

2
È necessario aggiungere commenti <summary> nel codice in modo che diventi più affidabile, coerente, decente, accessibile, stabile, robusto, solido, sicuro e chiaro.
Memet Olsen,

59

Il metodo Math.Sign è un modo per procedere. Restituirà -1 per i numeri negativi, 1 per i numeri positivi e 0 per i valori pari a zero (ovvero zero non ha segno). Le variabili di precisione doppie e singole causeranno un'eccezione ( ArithmeticException ) se uguagliano NaN.


Wow, non sapevo che esistesse. Cosa succede per NaN?
Tanmoy,

@Tanmoy: sembra che genererà un'eccezione in quel caso.
gnovice,

1
Ma poi deve verificare se il risultato di Math.Sign è anche positivo o negativo! Usa Math.Sign anche per quello? ;)
AndrewC,

3
@AndyC: Mi è piaciuto l'umorismo, ma dovrebbe fare un confronto di uguaglianza con il valore di ritorno di Math.Sign(dal momento che definisce esplicitamente i possibili valori di ritorno.)
Rob

Non mi aspettavo di trovare una risposta utile sotto questa domanda, ma questo è quello che stavo cercando. Grazie.
Paul

56
num < 0 // number is negative

12
Presumo che questo sia un principiante, che dovremmo cercare di aiutare. Una volta che hai imparato nel modo giusto - controlla questo per il modo sbagliato thedailywtf.com/Articles/…
Lou Franco

1
all'inizio non riuscivo a credere alla domanda sulla pagina principale, poi sono venuto qui ... :) e questo ragazzo non è solo ... oh caro :)
slashmais

25

Questo è lo standard del settore:

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

Questo non è C # però
Episodex

5
L'ho provato. Alla fine il mio programma ha esaurito la memoria. Potrebbe esserci una perdita nel tuo codice?
Thomas Tempelmann,

4
@Will, ben fatto per aver individuato questa perdita molto oscura! Anche se ti disapprovo, cambiando il significato della frase introduttiva del poster originale. Credo ancora che sia corretto definire questo standard industriale. Quindi, per mantenere lo spirito di questa risposta e rispetto al poster originale, ho ripristinato la tua modifica, ok?
Thomas Tempelmann,

4
@Will, devo davvero dichiarare l'ovvio sul post originale e sui miei commenti, che hanno ottenuto voti mentre il tuo no? (Spoiler: ha a che fare con il sarcasmo, e il tuo no, il che significa che hai ucciso la battuta che il male esisteva qui - o pensi davvero che questa risposta doveva essere presa sul serio ??)
Thomas Tempelmann

2
Eccoci, ripristinati, segnalati e sottoposti a downgrade. Non sapevo che fosse uno scherzo.
Sarà il

19

Voi giovani e la vostra fantasia non è altro che segni.

Ai miei tempi dovevamo usare Math.abs(num) != num //number is negative!


(Se non fosse ovvio, questo doveva essere umorismo)
Powerlord,

2
@Eric: No, perché genera un OverflowExceptionse numè MinValueper qualunque tipo è passato in ( Int16, Int32, Int64). I risultati sono anche peggiori per i valori in virgola mobile, dove potrebbero anche essere NaN, da allora NaN != NaN.
Powerlord,

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

9

Versione del programmatore nativo. 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);
   }
   return result;
}

Non usarlo mai.


9
"Non usarlo mai"? Ma è un codice di qualità aziendale, perfetto per il software aziendale! Ti manca IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, e IsPositiveCheckerFactoryInterface, però.
Tim Čas,

1
L'ho appena usato nella mia app console Hello World. 10/10 lo farebbe di nuovo.
Vahid Amiri,

ti manca un set di parentesi poiché '&' ha una precedenza inferiore a '==', quindi dovresti result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;invece averlo . Inoltre, dovresti avere un return result;posto lì alla fine in modo che restituisca effettivamente il risultato.
Dragonrage,

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

o usa "else ifs"


6

Per un numero intero con System.Int32segno inta 32 bit, ad esempio aka in 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

Devi solo confrontare se il valore e il suo valore assoluto sono uguali:

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

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

0

Il primo parametro è memorizzato nel registro EAX e anche il risultato.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.