C #에서 숫자가 양수인지 음수인지 어떻게 확인합니까?


206

C #에서 숫자가 양수인지 음수인지 어떻게 확인합니까?

답변:


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

18
가난한 오래된 음수 0은 어떻습니까!
— 그랜트 크 로프턴

3
@SimonFischer 확실히 수학과 컴퓨터 과학, 음수와 양수 0을 사용하는 정규 과학이 있습니다. 예를 들어 화학자 및 물리학자는 음수이고 0으로 반올림 된 숫자에 -0을 사용하는 경우가 있습니다. 정의는 컨텍스트 내에서만 의미가 있습니다. 수학적 정의를 다룰 때, 그것이 실제로 보편적 인 것처럼 배운다면, 다른 수학적 상황에서 잘못 될 위험이 있습니다.
— VoronoiPotato

177

물론 아무도 정답을 얻지 못했습니다.

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

4
아니, 영업 이익은 요구한다면, is positive or is negative하지is (positive or negative)
— T.Todua

0 여전히 긍정적
— Jude Bautista

@ T.Todua 나는 그것이 농담이었다고 생각합니다.
— 황천의 화강암

83

지나침!

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
내부적으로는를 ISignDeterminator사용하여 구현하는 클래스를 인스턴스화해야 합니다 SignDeterminatorFactory.
— 제시 C. 슬라이서

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과 같은 값의 경우 0을 반환합니다 (예 : 0에는 부호가 없음). 배정 밀도 및 단 정밀도 변수는 NaN과 동일한 경우 예외 ( ArithmeticException )가 발생합니다.


와우는 이것이 존재한다는 것을 몰랐습니다. NaN은 어떻게됩니까?
— Tanmoy

@ Tanmoy : 이 경우 예외가 발생하는 것처럼 보입니다 .
— gnovice

1
그러나 Math.Sign의 결과가 긍정적인지 부정적인지 확인해야합니다! 그는 Math.Sign도 사용합니까? ;)
— AndrewC

3
@AndyC : 나는 유머를 즐겼지만, Math.Sign가능한 반환 값을 명시 적으로 정의하기 때문에 의 반환 값에 대해 동등 비교를 수행해야 합니다.
— Rob

이 질문 아래에서 유용한 답변을 찾지는 못했지만 실제로는 내가 찾던 것입니다. 감사.
— Paul

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
@Will,이 매우 모호한 누출을 발견하여 잘 끝났습니다! 원래 포스터의 입문 문장의 의미를 바꾸는 것에 대해 나는 눈살을 찌푸렸다. 나는 이것을 이것을 업계 표준이라고 부르는 것이 옳다고 믿는다. 따라서이 답변의 정신을 유지하고 원래 포스터와 관련하여 편집 내용을 되돌 렸습니다.
— Thomas Tempelmann

4
@ 윌, 원래 게시물과 내 의견에 대해 분명하게 진술해야합니까? (스포일러 : 풍자와 관련이 있으며, 당신과는 관계가 없습니다. 즉, 여기에 나쁜 농담을 죽였다는 의미입니다. 또는이 답변이 진지하게 받아 들여 졌다고 생각하십니까?)
— Thomas Tempelmann

2
거기서 우리는 돌아가고, 깃발을 돌리고, 투표를했습니다. 나는 이것이 농담인지 몰랐다.
— 윌

19

당신은 영인들과 당신의 공상보다 적습니다.

나의 시대에 우리는 사용해야했다 Math.abs(num) != num //number is negative!


(명확하지 않은 경우, 이것은 유머로 의도 된 것입니다)
— Powerlord

2
@Eric : 아니, 그것이 던져 때문에 OverflowException경우 num입니다 MinValue전달됩니다 어떤 유형 ( Int16, Int32, Int64). 결과는도 될 수 소수점 값을 부동 더 악화되어 NaN있기 때문에 NaN != NaN.
— Powerlord

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

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, 그래도.
— Tim Čas

1
Hello World 콘솔 앱에서 이것을 사용했습니다. 10/10이 다시 할 것입니다.
— Vahid Amiri

'&'가 '=='보다 우선 순위가 낮으므로 괄호 세트가 누락되었으므로 result = (Marshal.ReadByte(memory, 3) & 0x80) == 0;대신 사용해야 합니다. 또한 return result;마지막에 어딘가에 있어야 실제로 결과를 반환합니다.
— Dragonrage

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

또는 "else ifs"를 사용하십시오


6

C #에서 System.Int32일명 32 비트 부호있는 정수의 경우 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

값과 절대 값이 같은지 비교하면됩니다.

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

이 코드는 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 레지스터에 저장되며 결과도 있습니다.

function IsNegative(ANum: Integer): LongBool; assembler;
asm
   and eax, $80000000
end;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.