С#, 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)