ฉันจะตรวจสอบว่าตัวเลขเป็นบวกหรือลบใน C # ได้อย่างไร


206

ฉันจะตรวจสอบว่าตัวเลขเป็นบวกหรือลบใน C # ได้อย่างไร

คำตอบ:


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

18
แล้วศูนย์ลบเก่าที่แย่ล่ะ!
Grant Crofton

3
@SimonFischer มีสาขาคณิตศาสตร์วิทยาศาสตร์คอมพิวเตอร์และวิทยาศาสตร์ทั่วไปที่ใช้ศูนย์บวกและลบอย่างแน่นอน ยกตัวอย่างเช่นนักเคมีและนักฟิสิกส์บางครั้งจะใช้ -0 สำหรับจำนวนที่เป็นลบและปัดเศษเป็นศูนย์ คำจำกัดความมีความหมายภายในบริบทเท่านั้น เมื่อคุณปฏิบัติตามคำจำกัดความทางคณิตศาสตร์ที่คุณได้รับการสอนราวกับว่าพวกเขาเป็นสากลอย่างแท้จริงคุณมีความเสี่ยงที่จะสิ้นสุดในบริบททางคณิตศาสตร์ที่แตกต่างที่คุณผิด
VoronoiPotato

177

แน่นอนว่าไม่มีใครได้รับคำตอบที่ถูกต้อง

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

4
ไม่ OP ถามว่า is positive or is negativeไม่ใช่is (positive or negative)
T.Todua

0 ยังคงเป็นบวก
Jude Bautista

@ T.Todua ฉันเชื่อว่าเป็นเรื่องตลก
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
ภายในก็ควร instantiate ชั้นซึ่งดำเนินการใช้ISignDeterminator SignDeterminatorFactory
เจสซีซี. เครื่องตัด

10
ไม่สมบูรณ์: คุณควรตรวจสอบ IsNaN () เช่นกัน;)
slashmais

3
@slashmais: บนint?! คุณกำลังทำงานในดินแดนมหัศจรรย์ของ C #
Jeff Yates

2
สำหรับ NET 4.0 IsImaginaryคุณควรเพิ่ม
Ryan Lundy

2
คุณควรเพิ่ม <summary> ความเห็นในรหัสของคุณเพื่อให้มีความน่าเชื่อถือมากขึ้นสอดคล้องกันได้ดีเข้าถึงได้มั่นคงมั่นคงแข็งแกร่งมั่นคงปลอดภัยและชัดเจน
Memet Olsen

59

วิธี Math.Signเป็นวิธีหนึ่งที่จะไป มันจะกลับ -1 สำหรับจำนวนลบ 1 สำหรับตัวเลขบวกและ 0 สำหรับค่าเท่ากับศูนย์ (เช่นศูนย์ไม่มีสัญญาณ) ตัวแปรความแม่นยำสองเท่าและเดี่ยวจะทำให้เกิดข้อยกเว้น ( ArithmeticException ) หากมีการโยนเท่ากับ NaN


ว้าวไม่รู้เรื่องนี้แล้วเกิดอะไรขึ้นกับ NaN?
Tanmoy

@ Tanmoy: ดูเหมือนว่ามันจะมีข้อยกเว้นในกรณีนั้น
gnovice

1
แต่แล้วเขาก็ต้องตรวจสอบว่าผลลัพธ์ของ Math.Sign เป็นบวกหรือลบด้วยเช่นกัน! เขาใช้ Math.Sign เพื่อสิ่งนั้นด้วยหรือไม่? ;)
AndrewC

3
@AndyC: ฉันสนุกกับอารมณ์ขัน แต่เขาควรจะทำการเปรียบเทียบความเท่าเทียมกับค่าตอบแทนของMath.Sign(เพราะมันกำหนดค่าตอบแทนที่เป็นไปได้อย่างชัดเจน)
Rob

ฉันไม่ได้คาดหวังว่าจะพบคำตอบที่เป็นประโยชน์ด้านล่างคำถามนี้ แต่นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ
พอล

56
num < 0 // number is negative

12
ฉันคิดว่านี่เป็นผู้เริ่มต้นซึ่งเราควรพยายามช่วย เมื่อคุณเรียนรู้วิธีการที่ถูกต้อง - ตรวจสอบวิธีการที่ผิดthedailywtf.com/Articles/ …
Lou Franco

1
ตอนแรกฉันไม่อยากจะเชื่อคำถามในหน้าหลักจากนั้นฉันก็มาที่นี่ ... :) และผู้ชายคนนี้ไม่ได้อยู่คนเดียว ... ที่รัก :)
slashmais

25

นี่คือมาตรฐานอุตสาหกรรม:

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

นี่ไม่ใช่ C #
Episodex

5
ฉันลองแล้ว โปรแกรมของฉันหมดหน่วยความจำในที่สุด อาจมีการรั่วไหลในรหัสของคุณ?
Thomas Tempelmann

4
@ จะทำได้ดีสำหรับการสังเกตการรั่วไหลที่คลุมเครือนี้! แม้ว่าฉันขมวดคิ้วเมื่อคุณเปลี่ยนความหมายของประโยคเบื้องต้นของผู้โพสต์ดั้งเดิม ฉันยังเชื่อว่ามันถูกต้องที่จะเรียกสิ่งนี้ว่ามาตรฐานอุตสาหกรรม ดังนั้นเพื่อให้สอดคล้องกับเจตนารมณ์ของคำตอบนี้และด้วยความเคารพต่อผู้โพสต์ดั้งเดิมฉันได้ยกเลิกการแก้ไขของคุณแล้วใช่ไหม
Thomas Tempelmann

4
@ จะฉันต้องระบุชัดเจนเกี่ยวกับโพสต์ต้นฉบับและความคิดเห็นของฉันซึ่งได้ upvotes ในขณะที่คุณไม่? (สปอยเลอร์: มันเกี่ยวข้องกับการเสียดสีและคุณก็ไม่ได้หมายความว่าคุณได้ฆ่ามุขตลกที่มีอยู่ที่นี่หรือคุณคิดว่าคำตอบนี้จะต้องจริงจังหรือไม่?)
Thomas Tempelmann

2
ที่นั่นเราไปเปลี่ยนกลับตั้งค่าสถานะและลดระดับลง ฉันไม่รู้ว่านี่เป็นเรื่องตลก
จะ

19

คุณยังเด็กและสัญญาณน้อยกว่าที่คุณจินตนาการ

ย้อนกลับไปในวันที่เราต้องใช้Math.abs(num) != num //number is negative!


(หากไม่ชัดเจนนี่เป็นเรื่องตลก)
Powerlord

2
@ Eric: ไม่มีเพราะมันจะโยนOverflowExceptionถ้าnumเป็นMinValueประเภทสิ่งที่ผ่านไปมาใน ( Int16, Int32, Int64) ผลลัพธ์ยิ่งแย่ลงสำหรับค่าของจุดลอยตัวซึ่งอาจเป็นNaNเช่นนั้นNaN != NaNได้
Powerlord


9

เวอร์ชันของโปรแกรมเมอร์เจ้าของภาษา พฤติกรรมนั้นถูกต้องสำหรับระบบเล็ก ๆ น้อย ๆ

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

ไม่เคยใช้สิ่งนี้


9
"ไม่เคยใช้สิ่งนี้"? แต่เป็นรหัสคุณภาพระดับองค์กรเหมาะสำหรับซอฟต์แวร์ระดับองค์กร! คุณกำลังขาดหายไปIsPositiveChecker, IsPositiveCheckerInterface, IsPositiveCheckerFactoryและIsPositiveCheckerFactoryInterfaceแม้ว่า
ทิม Sepas

1
เพิ่งใช้สิ่งนี้ในแอปคอนโซล Hello World ของฉัน 10/10 จะทำมันอีกครั้ง
Vahid Amiri

คุณไม่มีวงเล็บอยู่เนื่องจาก '&' มีลำดับความสำคัญต่ำกว่า '==' ดังนั้นคุณควรมีresult = (Marshal.ReadByte(memory, 3) & 0x80) == 0;แทน นอกจากนี้คุณควรมีreturn result;ที่ไหนสักแห่งในตอนท้ายเพื่อที่จะได้ผลลัพธ์ที่แท้จริง
Dragonrage




5

คุณเพียงแค่ต้องเปรียบเทียบว่าค่า & ค่าสัมบูรณ์ของมันเท่ากัน:

if (value == Math.abs(value))
    return "Positif"
else return "Negatif"


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

รหัสนี้ใช้ประโยชน์จากคำแนะนำ SIMD เพื่อปรับปรุงประสิทธิภาพ

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

0

พารามิเตอร์แรกจะถูกเก็บไว้ใน EAX register และผลลัพธ์เช่นกัน

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.