С#, DETERMINE *, если * double может стать int без каких-либо потерь

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

У меня есть уникальная ситуация, когда все номера должны быть сохранены как тип данных double в моей базе данных, но только в определенных условиях точность выше ценного.

Сначала я попытался использовать int, а затем абстрактно в новую таблицу, когда эти уникальные дробные события произойдут, но после этого в течение нескольких недель я вижу теперь, что это слишком глупо и тратит время на мое время.

Я знаю, что могу превратить double в int. Это просто. Я знаю, как это перевести. То, что я не знаю, - это ТЕСТ для перевода. Я в основном хочу предложить короткий, простой способ сказать

Является ли это число действительно двойным, или это просто int?

Если это int (и большую часть времени это будет), я превращу его в один и рассмотрю как таковой. Но из-за уникальности требований я должен сохранить все в базе данных как double.

Любые идеи? Я знаю, что это вопрос новичков, и я несколько раз заглядывал в поисковик, и я все еще очень смущен.

Ответ 1

Эта аналогичная статья показывает вам, как определить, имеет ли двойное или десятичное число десятичные числа или нет. Вы можете использовать это, чтобы определить, какой тип он есть, а затем сохранить соответствующим образом.

Принятый ответ с этого поста:

Для чисел с плавающей запятой 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

Ответ 2

Скопируйте его в int и посмотрите, все ли он равен:

if ((int)val == val)

(int)val будет усекать любую дробную часть.

Обратите внимание, что это может привести к неожиданным неожиданностям, если число слишком велико, чтобы сохранить полную точность в double.

Ответ 3

double d = ...;

if(d == (int)d)
   //is int
else
  //is not int

Конечно, из-за некоторых проблем с точностью, это может не работать 100% раз. Вы можете использовать

double d = ...;

if(Math.Abs(d - (int)d) < Epsilon) //const double Epsilon = 0.000001;
   //is int
else
  //is not int

Ответ 4

попробуйте это

double x = ......

if (Math.truncate(x) == x)

....... (is integer, unless its so big its outside the bounds)