Подтвердить что ты не робот

Какой хороший способ проверить, является ли double целым числом в С#?

Возможный дубликат:
Как определить, является ли десятичное/двойное целое число?

У меня есть переменная типа double, и я хочу проверить, является ли это целым числом.

В данный момент у меня есть

public bool CheckIfInteger(double number)
{
    return number.ToString().Contains(".") == false;
}

Есть ли лучший способ?

UPDATE: Извините, я не понимал возможности путаницы, по целому я имел в виду математическое определение целого числа, то есть натуральные числа вместе с отрицаниями ненулевых натуральных чисел.

4b9b3361

Ответ 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;
    }