Bagaimana cara saya memeriksa apakah angka positif atau negatif dalam C #?


206

Bagaimana cara saya memeriksa apakah angka positif atau negatif dalam C #?

Jawaban:


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

18
Bagaimana dengan nol negatif tua yang buruk ?!
Grant Crofton

3
@SimonFischer Jelas ada cabang matematika, ilmu komputer, juga ilmu pengetahuan biasa yang menggunakan nol negatif dan positif. Kimiawan dan fisikawan misalnya kadang-kadang akan menggunakan -0 untuk angka yang negatif dan dibulatkan menjadi nol. Definisi hanya memiliki makna dalam konteks. Ketika Anda memperlakukan definisi matematika Anda diajarkan seolah-olah mereka benar-benar universal, Anda berisiko berakhir dalam konteks matematika yang berbeda di mana Anda salah.
VoronoiPotato

177

Tentu saja tidak ada yang benar-benar memberikan jawaban yang benar,

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

4
tidak, OP bertanya apakah is positive or is negativetidakis (positive or negative)
T.Todua

0 masih positif
Jude Bautista

@ T.Todua Saya percaya itu adalah lelucon.
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
Secara internal, harus instantiate kelas yang mengimplementasikan ISignDeterminatormenggunakan a SignDeterminatorFactory.
Jesse C. Slicer

10
Tidak lengkap: Anda harus memeriksa IsNaN () juga;)
slashmais

3
@slashmais: Sedang int?! Apa tanah ajaib dari C # yang kamu garap?
Jeff Yates

2
Untuk .NET 4.0 Anda harus menambahkan IsImaginary.
Ryan Lundy

2
Anda harus menambahkan komentar <summary> dalam kode Anda sehingga menjadi lebih dapat diandalkan, konsisten, layak, dapat diakses, stabil, kuat, solid, aman dan jelas.
Memet Olsen

59

The Metode Math.Sign adalah salah satu cara untuk pergi. Ini akan mengembalikan -1 untuk angka negatif, 1 untuk angka positif, dan 0 untuk nilai yang sama dengan nol (yaitu nol tidak memiliki tanda). Variabel presisi ganda dan tunggal akan menyebabkan eksepsi ( ArithmeticException ) dibuang jika mereka sama dengan NaN.


Wow tidak tahu ini ada. Apa yang terjadi pada NaN?
Tanmoy

@ Tanmoy: Sepertinya itu akan melempar pengecualian dalam kasus itu.
gnovice

1
Tapi kemudian dia harus memeriksa apakah hasil Math.Sign juga positif atau negatif! Apakah dia menggunakan Math. Sign untuk itu juga? ;)
AndrewC

3
@AndyC: Saya menikmati humor, tapi dia harus melakukan perbandingan kesetaraan terhadap nilai kembali Math.Sign(karena secara eksplisit menentukan nilai pengembalian yang mungkin.)
Rob

Saya tidak berharap menemukan jawaban yang berguna di bawah pertanyaan ini, tetapi ini sebenarnya yang saya cari. Terima kasih.
Paul

56
num < 0 // number is negative

12
Saya berasumsi bahwa ini adalah pemula, yang harus kita coba bantu. Setelah Anda mempelajari cara yang benar - periksa ini dengan cara yang salah thedailywtf.com/Articles/...
Lou Franco

1
pada awalnya saya tidak bisa mempercayai pertanyaan di halaman utama, lalu saya datang ke sini ... :) dan orang ini tidak sendirian ... oh sayang :)
slashmais

25

Ini adalah standar industri:

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

Ini bukan C #
Episodex

5
Saya mencobanya. Program saya akhirnya kehabisan memori. Mungkinkah ada kebocoran pada kode Anda?
Thomas Tempelmann

4
@ Akan, dilakukan dengan baik untuk melihat kebocoran yang sangat tidak jelas ini! Meskipun aku tidak suka padamu mengubah arti kalimat pengantar poster asli. Saya masih percaya benar untuk menyebut ini standar industri. Karenanya, untuk menjaga semangat jawaban ini, dan sehubungan dengan poster asli, saya telah mengembalikan hasil edit Anda, oke?
Thomas Tempelmann

4
@ Akan, apakah saya benar-benar perlu menyatakan yang jelas tentang pos asli dan komentar saya, yang mendapat suara sementara Anda tidak? (Spoiler: ini ada hubungannya dengan sarkasme, dan sarkasme Anda tidak, yang berarti Anda telah membunuh lelucon yang buruk ada di sini - atau apakah Anda benar-benar berpikir bahwa jawaban ini dimaksudkan untuk ditanggapi dengan serius ??)
Thomas Tempelmann

2
Di sana kita pergi, dipulihkan, ditandai, dan diturunkan. Saya tidak menyadari ini adalah lelucon.
Will

19

Anda anak muda dan tanda-tanda Anda yang kurang mewah.

Kembali di hari saya, kami harus menggunakan Math.abs(num) != num //number is negative!


(Jika tidak jelas, ini dimaksudkan untuk menjadi humor)
Powerlord

2
@ Eric: Tidak, karena akan membuang OverflowExceptionjika numadalah MinValueuntuk jenis apa pun yang berlalu dalam ( Int16, Int32, Int64). Hasilnya bahkan lebih buruk untuk nilai floating point, di mana mereka juga bisa NaN, karena NaN != NaN.
Powerlord

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

9

Versi programmer asli. Perilaku benar untuk sistem 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;
}

Jangan pernah gunakan ini.


9
"Jangan pernah gunakan ini"? Tetapi ini adalah kode kualitas perusahaan, sempurna untuk perangkat lunak perusahaan! Anda hilang IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, dan IsPositiveCheckerFactoryInterface, meskipun.
Tim Čas

1
Baru saja menggunakan ini di aplikasi konsol Hello World saya. 10/10 akan melakukannya lagi.
Vahid Amiri

Anda kehilangan satu set kurung karena '&' memiliki prioritas lebih rendah daripada '==', jadi Anda seharusnya memiliki result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;. Juga, Anda harus memiliki suatu return result;tempat di sana pada akhirnya sehingga benar-benar akan mengembalikan hasilnya.
Dragonrage

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

atau gunakan "jika seandainya"


6

Untuk integer bertanda 32-bit, seperti System.Int32, alias intdi 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

Anda hanya perlu membandingkan jika nilai & nilai absolutnya sama:

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

Kode ini memanfaatkan instruksi SIMD untuk meningkatkan kinerja.

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

0

Parameter pertama disimpan dalam register EAX dan hasilnya juga.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.