Wie überprüfe ich, ob eine Zahl in C # positiv oder negativ ist?


206

Wie überprüfe ich, ob eine Zahl in C # positiv oder negativ ist?

Antworten:


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

18
Was ist mit der armen alten negativen Null?!
Grant Crofton

3
@SimonFischer Es gibt definitiv Zweige der Mathematik, der Informatik und der regulären Wissenschaft, die eine negative und eine positive Null verwenden. Zum Beispiel verwenden Chemiker und Physiker manchmal -0 für eine Zahl, die negativ und auf Null gerundet war. Definitionen haben nur innerhalb eines Kontexts Bedeutung. Wenn Sie die gelehrten mathematischen Definitionen so behandeln, als wären sie wirklich universell, riskieren Sie, in einen anderen mathematischen Kontext zu geraten, in dem Sie sich irren.
VoronoiPotato

177

Natürlich hat niemand die richtige Antwort gegeben,

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

4
Nein, OP fragte, wenn is positive or is negativenichtis (positive or negative)
T.Todua

0 immer noch positiv
Jude Bautista

@ T.Todua Ich glaube das war der Witz.
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
Intern sollte eine Klasse instanziiert werden, die die ISignDeterminatorVerwendung von a implementiert SignDeterminatorFactory.
Jesse C. Slicer

10
Unvollständig: Sie sollten auch nach IsNaN () suchen;)
Slashmais

3
@slashmais: Auf einem int?! In welchem ​​magischen Land von C # arbeitest du?
Jeff Yates

2
Für .NET 4.0 sollten Sie hinzufügen IsImaginary.
Ryan Lundy

2
Sie sollten Ihrem Code einen <summary> -Kommentar hinzufügen, damit er zuverlässiger, konsistenter, anständiger, zugänglicher, stabiler, robuster, solider, sicherer und klarer wird.
Memet Olsen

59

Die Math.Sign-Methode ist ein Weg. Es wird -1 für negative Zahlen, 1 für positive Zahlen und 0 für Werte gleich Null zurückgegeben (dh Null hat kein Vorzeichen). Variablen mit doppelter und einfacher Genauigkeit führen dazu, dass eine Ausnahme ( ArithmeticException ) ausgelöst wird, wenn sie NaN entsprechen.


Wow wusste nicht, dass es das gibt. Was passiert mit NaN?
Tanmoy

@ Tanmoy: Sieht so aus, als würde es in diesem Fall eine Ausnahme auslösen .
Gnovice

1
Aber dann muss er prüfen, ob das Ergebnis von Math.Sign auch positiv oder negativ ist! Verwendet er Math.Sign auch dafür? ;)
AndrewC

3
@AndyC: Ich habe den Humor genossen, aber er sollte einen Gleichheitsvergleich mit dem Rückgabewert von durchführen Math.Sign(da er mögliche Rückgabewerte explizit definiert.)
Rob

Ich hatte nicht erwartet, unter dieser Frage eine nützliche Antwort zu finden, aber genau das habe ich gesucht. Vielen Dank.
Paul

56
num < 0 // number is negative

12
Ich gehe davon aus, dass dies ein Anfänger ist, dem wir helfen sollten. Sobald Sie den richtigen Weg gelernt haben - überprüfen Sie dies auf den falschen Weg thedailywtf.com/Articles/…
Lou Franco

1
Zuerst konnte ich die Frage auf der Hauptseite nicht glauben, dann kam ich hierher ... :) und dieser Typ ist nicht allein ... oh je :)
Slashmais

25

Dies ist der Industriestandard:

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

Dies ist jedoch nicht C #
Episodex

5
Ich habe es ausprobiert. Mein Programm hatte irgendwann keinen Speicher mehr. Könnte es ein Leck in Ihrem Code geben?
Thomas Tempelmann

4
@Will, gut gemacht, um dieses sehr dunkle Leck zu entdecken! Obwohl ich die Stirn runzele, wenn Sie die Bedeutung des Einleitungssatzes des Originalplakats ändern. Ich glaube immer noch, dass es richtig ist, dies als Industriestandard zu bezeichnen. Um dem Geist dieser Antwort und dem Originalplakat gerecht zu werden, habe ich Ihre Bearbeitung zurückgesetzt, okay?
Thomas Tempelmann

4
@ Will, muss ich wirklich das Offensichtliche über den ursprünglichen Beitrag und meine Kommentare angeben, die positive Stimmen erhalten haben, während Ihre dies nicht tun? (Spoiler: Es hat mit Sarkasmus zu tun, und Ihrer nicht, was bedeutet, dass Sie den Witz getötet haben, den es hier gab - oder glauben Sie wirklich, dass diese Antwort ernst genommen werden sollte?)
Thomas Tempelmann

2
Los geht's, rückgängig gemacht, markiert und herabgestimmt. Mir war nicht bewusst, dass dies ein Witz war.
Will

19

Sie Youngins und Ihre Phantasie weniger als Zeichen.

Damals mussten wir verwenden Math.abs(num) != num //number is negative!


(Wenn es nicht offensichtlich war, sollte dies Humor sein)
Powerlord

2
@Eric: Nein, denn es wird ein Wurf , OverflowExceptionwenn numist MinValuefür was auch immer Art in übergeben wird ( Int16, Int32, Int64). Die Ergebnisse sind für Gleitkommawerte noch schlechter, wo sie NaNseitdem auch sein könnten NaN != NaN.
Powerlord

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

9

Native Programmiererversion. Das Verhalten ist für Little-Endian-Systeme korrekt.

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

Verwenden Sie dies niemals.


9
"Benutze das nie"? Aber es ist Code in Unternehmensqualität, perfekt für Unternehmenssoftware! Sie fehlt IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, und IsPositiveCheckerFactoryInterface, though.
Tim

1
Ich habe dies gerade in meiner Hello World-Konsolen-App verwendet. 10/10 würde es wieder tun.
Vahid Amiri

Sie vermissen eine Reihe von Klammern, da '&' eine niedrigere Priorität als '==' hat, also sollten Sie result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;stattdessen haben. Außerdem sollten Sie return result;am Ende irgendwo einen haben, damit das Ergebnis tatsächlich zurückgegeben wird.
Dragonrage

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

oder benutze "else ifs"


6

Für eine 32-Bit - Ganzzahl mit Vorzeichen, wie beispielsweise System.Int32, auch bekannt als intin 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

Sie müssen nur vergleichen, ob der Wert und sein absoluter Wert gleich sind:

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

Dieser Code nutzt SIMD-Anweisungen, um die Leistung zu verbessern.

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

0

Der erste Parameter wird im EAX-Register gespeichert und das Ergebnis auch.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.