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을 계산해야하지만 실제로 반올림 오류로 인해 숫자에 거의 근접하지만 정확히 같지 않은 계산을 수행하면 발생할 수 있습니다.
Instead, format it first and if your string ends in a period followed by zeros then strip them. There are also some formats that you can use that strip trailing zeros automatically. This might be good enough for your purpose.
double d = 1.0002;
Console.WriteLine(d.ToString("0.##"));
d = 1.02;
Console.WriteLine(d.ToString("0.##"));
Output:
1
1.02
bool IsInteger(double num) {
if (ceil(num) == num && floor(num) == num)
return true;
else
return false;
}
Problemo solvo.
Edit: Pwned by Mark Rushakoff.
If upper and lower bound of Int32
matters:
public bool IsInt32(double value)
{
return value >= int.MinValue && value <= int.MaxValue && value == (int)value;
}
Mark Rushakoff's answer may be simpler, but the following also work and may be more efficient since there is no implicit division operation:
bool isInteger = (double)((int)f) == f ;
and
bool isInteger = (decimal)((int)d) == d ;
If you want a single expression for both types, perhaps
bool isInteger = (double)((int)val) == (double)val ;
static bool IsWholeNumber(double x)
{
return Math.Abs(x % 1) < double.Epsilon;
}
You can use String formatting for the double type. Here is an example:
double val = 58.6547;
String.Format("{0:0.##}", val);
//Output: "58.65"
double val = 58.6;
String.Format("{0:0.##}", val);
//Output: "58.6"
double val = 58.0;
String.Format("{0:0.##}", val);
//Output: "58"
Let me know if this doesn't help.
public static bool isInteger(decimal n)
{
return n - (Int64)n == 0;
}
I faced a similar situation, but where the value is a string. The user types in a value that's supposed to be a dollar amount, so I want to validate that it's numeric and has at most two decimal places.
Here's my code to return true if the string "s" represents a numeric with at most two decimal places, and false otherwise. It avoids any problems that would result from the imprecision of floating-point values.
try
{
// must be numeric value
double d = double.Parse(s);
// max of two decimal places
if (s.IndexOf(".") >= 0)
{
if (s.Length > s.IndexOf(".") + 3)
return false;
}
return true;
catch
{
return false;
}
I discuss this in more detail at http://progblog10.blogspot.com/2011/04/determining-whether-numeric-value-has.html.
Using int.TryParse will yield these results: var shouldBeInt = 3;
var shouldntBeInt = 3.1415;
var iDontWantThisToBeInt = 3.000f;
Console.WriteLine(int.TryParse(shouldBeInt.ToString(), out int parser)); // true
Console.WriteLine(int.TryParse(shouldntBeInt.ToString(), out parser)); // false
Console.WriteLine(int.TryParse(iDontWantThisToBeInt.ToString(), out parser)); // true, even if I don't want this to be int
Console.WriteLine(int.TryParse("3.1415", out parser)); // false
Console.WriteLine(int.TryParse("3.0000", out parser)); // false
Console.WriteLine(int.TryParse("3", out parser)); // true
Console.ReadKey();
Perhaps not the most elegant solution but it works if you are not too picky!
bool IsInteger(double num) {
return !num.ToString("0.################").Contains(".");
}
You could use the 'TryParse' method.
int.TryParse()
This checks to see if the value can be converted to an integer whole number value. The result can then indicate a flag which can be used elsewhere in your code.
Try this:
number == Convert.ToInt16(number);
참고URL : https://stackoverflow.com/questions/2751593/how-to-determine-if-a-decimal-double-is-an-integer
'IT story' 카테고리의 다른 글
C #보다 F #을 사용하는 것이 어떤 영역에서 더 적합 할 수 있습니까? (0) | 2020.05.01 |
---|---|
기계적 인조 인간; (0) | 2020.05.01 |
Sublime Text를 Git의 기본 편집기로 만들려면 어떻게해야합니까? (0) | 2020.05.01 |
NSString이 특정 문자로 시작하는지 확인하는 방법 (0) | 2020.05.01 |
Ubuntu에 OpenSSL 라이브러리를 어떻게 설치합니까? (0) | 2020.05.01 |