C # 'da bir sayının pozitif veya negatif olup olmadığını nasıl kontrol edebilirim?


206

C # 'da bir sayının pozitif veya negatif olup olmadığını nasıl kontrol edebilirim?

Yanıtlar:


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

18
Zayıf eski negatif sıfır ne olacak ?!
Grant Crofton

3
@SimonFischer Kesinlikle matematik, bilgisayar bilimi ve ayrıca negatif ve pozitif sıfır kullanan düzenli bilim dalları vardır. Örneğin kimyagerler ve fizikçiler, negatif olan ve sıfıra yuvarlanan bir sayı için bazen -0 kullanırlar. Tanımların sadece bir bağlam içinde anlamı vardır. Size öğretilen matematiksel tanımları gerçekten evrenselmiş gibi ele aldığınızda, yanlış olduğunuz farklı bir matematiksel bağlamda sonuçlanma riskiyle karşı karşıya kalırsınız.
VoronoiPotato

177

Tabii ki hiç kimseye aslında doğru cevap verilmedi,

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

4
hayır, OP sordu is positive or is negativedeğilis (positive or negative)
T.Todua

0 hala olumlu
Jude Bautista

@ T.Todua Bunun şaka olduğuna inanıyorum.
NetherGranite

83

AŞIRI YÜKLEME!

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
Dahili olarak, a ISignDeterminatorkullanarak uygulayan bir sınıfı başlatmalıdır SignDeterminatorFactory.
Jesse C. Slicer

10
Tamamlanmadı: IsNaN () de kontrol etmelisiniz;)
slashmais

3
@slashmais: Üzerinde intmi ?! Hangi büyülü C # ülkesinde çalışıyorsunuz?
Jeff Yates

2
.NET 4.0 için eklemeniz gerekir IsImaginary.
Ryan Lundy

2
Daha güvenilir, tutarlı, iyi, erişilebilir, istikrarlı, sağlam, sağlam, güvenli ve açık hale gelmesi için kodunuza <özet> yorum eklemelisiniz.
Memet Olsen

59

Math.Sign yöntemi gitmek için bir yoldur. Negatif sayılar için -1, pozitif sayılar için 1 ve sıfıra eşit değerler için 0 döndürür (yani sıfırın işareti yoktur). Çift ve tek duyarlıklı değişkenler, NaN'ye eşitlerse bir istisnanın ( ArithmeticException ) atılmasına neden olur.


Wow bunun var olduğunu bilmiyordu, NaN için ne oluyor?
Tanmoy

@Tanmoy: Bu durumda bir istisna atacak gibi görünüyor .
gnovice

1
Ama sonra Math.Sign'ın sonucunun da olumlu ya da olumsuz olup olmadığını kontrol etmesi gerekiyor! Bunun için Math.Sign kullanıyor mu? ;)
AndrewC

3
@AndyC: Mizahtan hoşlanıyordum, ancak Math.Sign(dönüş olası değerlerini açıkça tanımladığı için) dönüş değerine eşitlik karşılaştırması yapıyor olmalı .
Rob

Bu sorunun altında faydalı bir cevap bulmayı beklemiyordum, ama aslında aradığım şey bu. Teşekkürler.
Paul

56
num < 0 // number is negative

12
Bunun bir acemi olduğunu varsayıyorum, yardım etmeye çalışmalıyız. Doğru yolu öğrendikten sonra - bunu yanlış şekilde kontrol edin thedailywtf.com/Articles/…
Lou Franco

1
ilk başta ana sayfadaki soruya inanamadım, sonra buraya geldim ... :) ve bu adam yalnız değil ... ah canım :)
slashmais

25

Bu endüstri standardıdır:

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

Bu C # değil
Episodex

5
Denedim. Programım sonunda belleği doldu. Kodunuzda bir sızıntı olabilir mi?
Thomas Tempelmann

4
@ Bu çok belirsiz sızıntıyı tespit etmek için aferin! Gerçi sana asıl posterin tanıtım cümlesinin anlamını değiştirdim. Buna endüstri standardı demenin doğru olduğuna inanıyorum. Bu nedenle, bu cevabın ruhuyla devam etmek için ve orijinal afiş ile ilgili olarak, düzenlemenizi geri aldım, tamam mı?
Thomas Tempelmann

4
@Orijinal yazım ve sizinkiler olmasa da oy alan yorumlarım hakkında bariz bir şekilde belirtmem gerekiyor mu? (Spoiler: alay ile ilgili ve seninki yok, yani burada kötü olan şakayı öldürdün - ya da gerçekten bu cevabın ciddiye alınması gerektiğini mi düşünüyorsun ??)
Thomas Tempelmann

2
İşte başlıyoruz, geri döndük, işaretlendik ve indirildik. Bunun bir şaka olduğunun farkında değildim.
Will

19

Sen gençlerin ve süslülerin daha az.

Geri dönünce kullanmak zorunda kaldık Math.abs(num) != num //number is negative!


(Belli değilse, bu mizah
amaçlıydı

2
@Eric: Hayır, bir atmak çünkü OverflowExceptioneğer numolduğunu MinValuegeçirilen ne olursa olsun tipi için ( Int16, Int32, Int64). O NaNzamandan beri olabileceği yerde kayan nokta değerleri için sonuçlar daha da kötüdür NaN != NaN.
Powerlord

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

9

Yerel programcının sürümü. Küçük endian sistemler için davranış doğrudur.

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

Bunu asla kullanmayın.


9
"Bunu hiç kullanma" mı? Ancak kurumsal yazılım için mükemmel olan kurumsal kalitede kod! Sen kaçırıyorsun IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, ve IsPositiveCheckerFactoryInterface, gerçi.
Tim Čas

1
Bunu Hello World konsol uygulamamda kullandım. 10/10 tekrar yapardı.
Vahid Amiri

'&' önceliğinin '==' değerinden daha düşük önceliğe sahip olması nedeniyle bir parantez kümesini kaçırıyorsunuz result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;. Ayrıca, return result;sonunda bir yere sahip olmalısınız, böylece sonuç gerçekten geri dönecektir.
Dragonrage

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

veya "else ifs" kullanın


6

C # olarak System.Int32da bilinen 32 bit işaretli tam sayı için int:

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

Değerin ve mutlak değerinin eşit olup olmadığını karşılaştırmanız yeterlidir:

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

Bu kod, performansı artırmak için SIMD talimatlarından yararlanır.

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

0

İlk parametre EAX kaydında saklanır ve sonuç da elde edilir.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.