[C#] 10 진수 / 더블이 정수인지 확인하는 방법?

소수 또는 이중 값이 정수인지 어떻게 알 수 있습니까?

예를 들면 다음과 같습니다.

decimal d = 5.0; // Would be true
decimal f = 5.5; // Would be false

또는

double d = 5.0; // Would be true
double f = 5.5; // Would be false

나는 이것이 내가 출력에 사용하여 값을 원한다면 프로그래밍 결정할 수 있도록 알고 싶은 이유 .ToString("N0")또는 .ToString("N2"). 소수점 값이 없으면 표시하고 싶지 않습니다.



답변

부동 소수점 숫자의 경우 n % 1 == 0일반적으로 소수점을 지난 것이 있는지 확인하는 방법입니다.

public static void Main (string[] args)
{
    decimal d = 3.1M;
    Console.WriteLine((d % 1) == 0);
    d = 3.0M;
    Console.WriteLine((d % 1) == 0);
}

산출:

False
True

업데이트 : @Adrian Lopez가 아래 언급했듯이 작은 값을 비교epsilon하면 부동 소수점 계산 오류 계산이 무시됩니다. 문제는double값에관한 것이므로아래는 더 부동 소수점 계산 증명 답변입니다.

Math.Abs(d % 1) <= (Double.Epsilon * 100)


답변

이를 수행하는 방법에는 여러 가지가 있습니다. 예를 들면 다음과 같습니다.

double d = 5.0;
bool isInt = d == (int)d;

모듈로를 사용할 수도 있습니다.

double d = 5.0;
bool isInt = d % 1 == 0;


답변

이건 어때요?

public static bool IsInteger(double number) {
    return number == Math.Truncate(number);
}

의 동일한 코드입니다 decimal.

마크 바이어스 (Mark Byers)는 실제로 좋은 지적을했습니다. 이것은 실제로 당신 원하는 것이 아닐 수도 있습니다 . 당신이 경우 정말 걱정 것은 숫자가 정수입니다 가장 가까운 소수 둘째 자리까지 반올림 여부 , 대신이 작업을 수행 할 수 있습니다 :

public static bool IsNearlyInteger(double number) {
    return Math.Round(number, 2) == Math.Round(number);
}


답변

제안 된 솔루션이 간단한 예제에서 작동하는 것처럼 보이지만 일반적으로이 작업을 수행하는 것은 좋지 않습니다. 숫자는 정확히 정수가 아니지만 형식을 지정할 때 얻을 수있는 정수에 가깝습니다 1.000000. 이론적으로 정확히 1을 계산해야하지만 실제로 반올림 오류로 인해 숫자에 거의 근접하지만 정확히 같지 않은 계산을 수행하면 발생할 수 있습니다.

대신, 먼저 형식을 지정하고 문자열이 마침표로 끝나고 0이 오면 제거하십시오. 스트립 후행 0을 자동으로 사용할 수있는 형식도 있습니다. 이것은 당신의 목적에 충분할 것입니다.

double d = 1.0002;
Console.WriteLine(d.ToString("0.##"));
d = 1.02;
Console.WriteLine(d.ToString("0.##"));

산출:

1
1.02


답변

bool IsInteger(double num) {
    if (ceil(num) == num && floor(num) == num)
        return true;
    else
        return false;
}

Problemo solvo.

편집 : 마크 Rushakoff에 의해 Pwned.


답변

Mark Rushakoff의 답변은 더 간단 할 수 있지만 다음과 같은 작업도 수행되며 암시 적 나누기 작업이 없으므로 더 효율적일 수 있습니다.

     bool isInteger = (double)((int)f) == f ;

     bool isInteger = (decimal)((int)d) == d ;

두 유형 모두에 대해 단일 표현식을 원한다면

     bool isInteger = (double)((int)val) == (double)val ;


답변

상한 및 하한이 Int32중요한 경우 :

public bool IsInt32(double value)
{
    return  value >= int.MinValue && value <= int.MaxValue && value == (int)value;
}