Làm cách nào để kiểm tra xem một số dương hay âm trong C #?


206

Làm cách nào để kiểm tra xem một số dương hay âm trong C #?

Câu trả lời:


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

18
Thế còn người nghèo không già thì sao?
Grant Crofton

3
@SimonFischer Chắc chắn có các ngành toán học, khoa học máy tính, cũng là khoa học thường xuyên sử dụng số 0 âm và dương. Ví dụ, các nhà hóa học và vật lý học đôi khi sẽ sử dụng -0 cho một số âm và làm tròn thành số không. Định nghĩa chỉ có ý nghĩa trong một bối cảnh. Khi bạn đối xử với các định nghĩa toán học, bạn được dạy như thể chúng thực sự phổ quát, bạn có nguy cơ kết thúc trong một bối cảnh toán học khác, nơi bạn sai.
VoronoiPotato

177

Tất nhiên không ai thực sự đưa ra câu trả lời đúng,

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

4
không, OP hỏi nếu is positive or is negativekhôngis (positive or negative)
T.Todua

0 vẫn tích cực
Jude Bautista

@ T.Todua Tôi tin đó là trò đùa.
NetherGranite

83

QUÁ TUYỆT VỜI!

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
Trong nội bộ, nó sẽ khởi tạo một lớp thực hiện ISignDeterminatorbằng cách sử dụng một SignDeterminatorFactory.
Jesse C. Choper

10
Chưa hoàn tất: bạn cũng nên kiểm tra IsNaN ();)
slashmais

3
@slashmais: Ngày intnào?! Vùng đất huyền diệu nào của C # bạn đang làm việc?
Jeff Yates

2
Đối với .NET 4.0 bạn nên thêm IsImaginary.
Ryan Lundy

2
Bạn nên thêm bình luận <Tóm tắt> trong mã của mình để nó trở nên đáng tin cậy, nhất quán, đàng hoàng, dễ truy cập, ổn định, mạnh mẽ, vững chắc, an toàn và rõ ràng.
Memet Olsen

59

Các phương pháp Math.Sign là một trong những con đường để đi. Nó sẽ trả về -1 cho các số âm, 1 cho các số dương và 0 cho các giá trị bằng 0 (tức là số 0 không có dấu). Các biến chính xác kép và đơn sẽ khiến một ngoại lệ ( ArithaturesException ) bị ném nếu chúng bằng NaN.


Wow không biết điều này tồn tại. Điều gì xảy ra với NaN?
Tanmoy

@Tanmoy: Có vẻ như nó sẽ ném một ngoại lệ trong trường hợp đó.
gnovice

1
Nhưng sau đó anh ta phải kiểm tra xem kết quả của Math.Sign là dương hay âm! Anh ấy có sử dụng Math.Sign cho điều đó không? ;)
AndrewC

3
@AndyC: Tôi rất thích sự hài hước, nhưng anh ấy nên thực hiện so sánh bình đẳng với giá trị trả về của Math.Sign(vì nó xác định rõ ràng các giá trị trả về có thể.)
Rob

Tôi đã không mong đợi để tìm thấy một câu trả lời hữu ích bên dưới câu hỏi này, nhưng đây thực sự là những gì tôi đang tìm kiếm. Cảm ơn.
Paul

56
num < 0 // number is negative

12
Tôi cho rằng đây là người mới bắt đầu, chúng ta nên cố gắng giúp đỡ. Một khi bạn học đúng cách - hãy kiểm tra điều này theo cách sai thed Dailywtf.com/Articles/ Khăn
Lou Franco

1
Lúc đầu, tôi không thể tin được câu hỏi trên trang chính, sau đó tôi đến đây ... :) và anh chàng này không đơn độc ... trời ơi :)
slashmais

25

Đây là tiêu chuẩn ngành:

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

Đây không phải là C #
Episodex

5
Tôi đã thử nó ra. Chương trình của tôi cuối cùng đã hết bộ nhớ. Có thể có một rò rỉ trong mã của bạn?
Thomas Tempelmann

4
@ Sẽ, được thực hiện để phát hiện rò rỉ rất tối nghĩa này! Mặc dù tôi cau mày khi bạn thay đổi ý nghĩa của câu giới thiệu của người đăng ban đầu. Tôi vẫn tin rằng nó đúng khi gọi đây là tiêu chuẩn công nghiệp. Do đó, để giữ vững tinh thần của câu trả lời này và đối với poster gốc, tôi đã hoàn nguyên bản chỉnh sửa của mình, được chứ?
Thomas Tempelmann

4
@ Sẽ, tôi thực sự cần phải nêu rõ ràng về bài viết gốc và các bình luận của tôi, đã nhận được sự ủng hộ trong khi bạn không? (Spoiler: nó phải làm với sự mỉa mai, và của bạn thì không, điều đó có nghĩa là bạn đã giết chết trò đùa tồn tại ở đây - hoặc bạn có thực sự nghĩ rằng câu trả lời này có ý nghĩa nghiêm trọng không?)
Thomas Tempelmann

2
Ở đó chúng tôi đi, hoàn nguyên, gắn cờ và hạ cấp. Tôi đã không biết đây là một trò đùa.
Sẽ

19

Bạn trẻ và dấu hiệu ưa thích của bạn ít hơn.

Ngày trước, chúng tôi phải sử dụng Math.abs(num) != num //number is negative!


(Nếu điều đó không rõ ràng, điều này được dự định là hài hước)
Powerlord

2
@ Eric: Không, bởi vì nó sẽ ném một OverflowExceptionnếu numMinValueđối với bất cứ loại được thông qua vào ( Int16, Int32, Int64). Kết quả thậm chí còn tồi tệ hơn đối với các giá trị dấu phẩy động, nơi chúng cũng có thể NaN, kể từ đó NaN != NaN.
Powerlord

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

9

Phiên bản lập trình viên bản địa. Hành vi là chính xác cho các hệ thống endian nhỏ.

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

Đừng bao giờ sử dụng cái này.


9
"Đừng bao giờ sử dụng cái này"? Nhưng đó là mã chất lượng doanh nghiệp, hoàn hảo cho phần mềm doanh nghiệp! Bạn đang thiếu IsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactory, và IsPositiveCheckerFactoryInterface, mặc dù.
Tim Čas

1
Chỉ cần sử dụng điều này trong ứng dụng bảng điều khiển Hello World của tôi. 10/10 sẽ làm điều đó một lần nữa.
Vahid Amiri

bạn đang thiếu một bộ dấu ngoặc đơn vì '&' có mức độ ưu tiên thấp hơn '==', vì vậy bạn nên có một result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;thay thế. Ngoài ra, bạn nên có một return result;nơi nào đó ở đó vào cuối để nó thực sự sẽ trả về kết quả.
Dragonrage

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

hoặc sử dụng "if ifs"


6

Đối với số nguyên có chữ ký 32 bit, chẳng hạn như System.Int32, inttrong 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

Bạn chỉ cần so sánh nếu giá trị & giá trị tuyệt đối của nó bằng nhau:

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

Mã này tận dụng các hướng dẫn SIMD để cải thiện hiệu suất.

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

0

Tham số đầu tiên được lưu trữ trong thanh ghi EAX và kết quả cũng có.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.