Какой хороший способ проверить, является ли double целым числом в С#?
Возможный дубликат:
Как определить, является ли десятичное/двойное целое число?
У меня есть переменная типа double, и я хочу проверить, является ли это целым числом.
В данный момент у меня есть
public bool CheckIfInteger(double number)
{
return number.ToString().Contains(".") == false;
}
Есть ли лучший способ?
UPDATE: Извините, я не понимал возможности путаницы, по целому я имел в виду математическое определение целого числа, то есть натуральные числа вместе с отрицаниями ненулевых натуральных чисел.
Ответы
Ответ 1
return Math.Truncate(number) == number;
Как упоминалось в комментариях, вам может потребоваться учитывать тот факт, что представление double
вашего номера может не быть точным целым числом. В этом случае вам нужно будет указать допустимую погрешность:
double diff = Math.Abs(Math.Truncate(number) - number);
return (diff < 0.0000001) || (diff > 0.9999999);
Ответ 2
Если вы хотите проверить Integer, это сделает следующее:
public bool IsInteger(double number)
{
return (number % 1 == 0);
}
Если вы также хотите проверить, может ли число быть преобразованным в Int32:
public bool IsInt32(double number)
{
return (number % 1 == 0) && number >= Int32.MinValue && number <= Int32.MaxValue;
}
Ответ 3
Ловушка работы с строковыми представлениями - это используемый язык, и вы должны заботиться о проблемах округления. 0.999999999 можно рассматривать как целое число 1 в большинстве случаев. Ниже приведен небольшой фрагмент с учетом ошибок округления:
Math.Abs(number - Math.Round(number)) < EPSILON
где EPSILON - это двойное значение, которое достаточно мало для вашей цели, например, 0.00001
См. также дополнительную информацию: http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx
Ответ 4
Try:
public bool CheckIfInteger(double number)
{
return ((double) (int) number == number);
}
Или красивее:
public bool CheckIfInteger(double number)
{
return (Math.Floor(number) == number);
}
Ответ 5
Я бы использовал TryParse:
double value = 2.0;
int number;
bool result = Int32.TryParse(value.ToString(), out number);
Ответ 6
public static bool CheckIfInteger(double number)
{
return number - Math.Truncate(number) == 0;
}
Ответ 7
Я думаю, что лучший вопрос: как я могу определить, достаточно ли двойного числа, чтобы целое число считалось целым числом для моих целей? Потому что в противном случае вы должны столкнуться с двусмысленностями. Поэтому я бы рекомендовал что-то вроде этого:
return Math.Abs(someDouble - Math.Round(someDouble)) < TOLERANCE;
Ответ 8
Мне нравится идея abatishchev использовать CurrentCulture.
return number.ToString().Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) == false;
Неужели это не решит проблему epsilon (которую я даже не рассматривал изначально)?
Ответ 9
Я использую следующий метод расширения строки, который проверяет шаблон RegEx
public static bool IsInteger(this string inputString)
{
Regex regexInteger = new Regex(@"^[-]?\d+$");
Match m = regexInteger.Match(inputString);
return m.Success;
}