Jak sprawdzić, czy liczba jest dodatnia czy ujemna w C #?


206

Jak sprawdzić, czy liczba jest dodatnia czy ujemna w C #?

Odpowiedzi:


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

18
Co z biednym starym ujemnym zerem ?!
Grant Crofton,

3
@ SimonFischer Zdecydowanie istnieją gałęzie matematyki, informatyki, a także nauki ścisłe, które używają ujemnego i dodatniego zera. Na przykład chemicy i fizycy czasami używają -0 dla liczby, która była ujemna i zaokrąglona do zera. Definicje mają znaczenie tylko w kontekście. Kiedy traktujesz matematyczne definicje, których cię nauczono, tak jakby były naprawdę uniwersalne, ryzykujesz, że skończysz w innym kontekście matematycznym, w którym się mylisz.
VoronoiPotato

177

Oczywiście nikt nie udzielił poprawnej odpowiedzi,

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

4
nie, OP zapytał, czy is positive or is negativenieis (positive or negative)
T.Todua

0 wciąż pozytywnych
Jude Bautista

@ T.Todua Wierzę, że to był żart.
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
Wewnętrznie powinien tworzyć instancję klasy, która implementuje ISignDeterminatorza pomocą SignDeterminatorFactory.
Jesse C. Slicer

10
Nieukończone: powinieneś również sprawdzić IsNaN ();)
slashmais

3
@slashmais: On int?! W jakiej magicznej krainie C # pracujesz?
Jeff Yates,

2
W przypadku .NET 4.0 należy dodać IsImaginary.
Ryan Lundy,

2
Powinieneś dodać komentarz <summary> do swojego kodu, aby stał się bardziej niezawodny, spójny, przyzwoity, dostępny, stabilny, solidny, solidny, bezpieczny i przejrzysty.
Memet Olsen

59

Metoda Math.Sign to jedna droga. Zwróci -1 dla liczb ujemnych, 1 dla liczb dodatnich i 0 dla wartości równych zero (tzn. Zero nie ma znaku). Zmienne o podwójnej i pojedynczej precyzji spowodują zgłoszenie wyjątku (wyjątek Arithmetic ), jeśli są równe NaN.


Wow, nie wiedziałem, że to istnieje. Co się dzieje z NaN?
Tanmoy,

@Tanmoy: Wygląda na to, że w tym przypadku wygeneruje wyjątek .
gnovice,

1
Ale potem musi sprawdzić, czy wynik Math.Sign jest dodatni czy ujemny! Czy używa do tego również Math.Sign? ;)
AndrewC

3
@AndyC: Podobał mi się humor, ale powinien on robić porównanie równości z wartością zwracaną Math.Sign(ponieważ wyraźnie określa możliwe wartości zwrotu.)
Rob

Nie spodziewałem się znaleźć przydatnej odpowiedzi pod tym pytaniem, ale w rzeczywistości tego właśnie szukałem. Dzięki.
Paul

56
num < 0 // number is negative

12
Zakładam, że jest to początkujący, któremu powinniśmy pomóc. Kiedy nauczysz się właściwej drogi - sprawdź to w niewłaściwy sposób thedailywtf.com/Articles/…
Lou Franco

1
na początku nie mogłem uwierzyć w pytanie na stronie głównej, potem przyszedłem tutaj ... :) a ten facet nie jest sam ... ojej :)
slashmais

25

To jest standard branżowy:

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

To nie jest C #
Episodex

5
Wypróbowałem to. W moim programie zabrakło pamięci. Czy może być wyciek w twoim kodzie?
Thomas Tempelmann

4
@Will, dobra robota za wykrycie tego bardzo niejasnego wycieku! Choć marszczę brwi, że zmieniłeś znaczenie zdania wprowadzającego oryginalnego plakatu. Nadal uważam, że można nazwać to standardem branżowym. Dlatego, aby zachować ducha tej odpowiedzi i w odniesieniu do oryginalnego plakatu, cofnąłem twoją edycję, dobrze?
Thomas Tempelmann,

4
@Czy naprawdę muszę podać oczywiste informacje o oryginalnym poście i moich komentarzach, które uzyskały poparcie, podczas gdy twoje nie? (Spoiler: ma to związek z sarkazmem, a twój nie, co oznacza, że ​​zabiłeś żart, że istniało tu zło - czy naprawdę uważasz, że tę odpowiedź należy potraktować poważnie?)
Thomas Tempelmann

2
Proszę bardzo, cofnęliśmy, oflagowaliśmy i przegłosowaliśmy. Nie wiedziałem, że to żart.
Czy

19

Wy, młodzi, i wasze fantazyjne mniej niż znaki.

W moich czasach musieliśmy używać Math.abs(num) != num //number is negative!


(Jeśli nie było to oczywiste, miał to być humor)
Powerlord,

2
@Eric: Nie, ponieważ będzie ona rzucać OverflowExceptionjeśli numjest MinValuedla każdego typu jest przekazywana ( Int16, Int32, Int64). Wyniki są jeszcze gorsze dla zmiennoprzecinkowych, gdzie mogą być one również NaN, ponieważ NaN != NaN.
Powerlord,

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

9

Wersja natywnego programisty. Zachowanie jest poprawne dla systemów 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;
}

Nigdy tego nie używaj.


9
„Nigdy tego nie używaj”? Ale jest to kod jakości korporacyjnej, idealny do oprogramowania korporacyjnego! Tracisz IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, i IsPositiveCheckerFactoryInterface, choć.
Tim Čas,

1
Właśnie tego użyłem w mojej aplikacji konsoli Hello World. 10/10 zrobiłby to jeszcze raz.
Vahid Amiri

brakuje zestawu nawiasów, ponieważ „&” ma niższy priorytet niż „==”, więc powinieneś je mieć result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;. Ponadto powinieneś mieć return result;gdzieś tam na końcu, aby rzeczywiście zwrócił wynik.
Dragonrage

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

lub użyj „else ifs”


6

Dla 32-bitowej liczby całkowitej ze znakiem, takiej jak System.Int32aka intw języku 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

Musisz tylko porównać, czy wartość i jej wartość bezwzględna są równe:

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

Ten kod wykorzystuje instrukcje SIMD w celu poprawy wydajności.

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

0

Pierwszy parametr jest przechowywany w rejestrze EAX i wynik również.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.