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.