检查double是否是C#中的整数有什么好方法?

时间:2010-11-02 11:40:40

标签: c# .net types integer double

  

可能重复:
  How to determine if a decimal/double is an integer?

我有一个double类型的变量,我想检查它是否是一个整数。

目前我有

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

有更好的方法吗?

更新:对不起我没有意识到混淆的可能性,整数我的意思是整数的数学定义,即自然数和非零自然数的负数。

9 个答案:

答案 0 :(得分:29)

return Math.Truncate(number) == number;

正如评论中所提到的,您可能需要考虑这样一个事实:您的号码的double表示可能不是完全整数。在这种情况下,您需要允许一些误差:

double diff = Math.Abs(Math.Truncate(number) - number);
return (diff < 0.0000001) || (diff > 0.9999999);

答案 1 :(得分:24)

如果要检查整数,可以这样做:

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;
}

答案 2 :(得分:15)

使用字符串表示的缺陷是使用的语言环境,并且您必须处理舍入问题。在大多数情况下,0.999999999可以被认为是整数1。这是一个考虑了舍入错误的小片段:

Math.Abs(number - Math.Round(number)) < EPSILON

其中EPSILON是一个足​​够小的双倍值,例如0.00001

有关更多信息,请参阅此内容:http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx

答案 3 :(得分:6)

尝试:

public bool CheckIfInteger(double number)
{
    return ((double) (int) number == number);
}

或者更漂亮:

public bool CheckIfInteger(double number)
{
    return (Math.Floor(number) == number);
}

答案 4 :(得分:4)

我使用TryParse

  double value = 2.0;
  int number;
  bool result = Int32.TryParse(value.ToString(), out number);

答案 5 :(得分:2)

    public static bool CheckIfInteger(double number)
    {
        return number - Math.Truncate(number) == 0;
    }

答案 6 :(得分:2)

我认为一个更好的问题是:如何判断double是否足够接近整数,以便将其视为整数?因为否则,你一定会遇到歧义。所以我建议这样的事情:

return Math.Abs(someDouble - Math.Round(someDouble)) < TOLERANCE;

答案 7 :(得分:1)

我喜欢abatishchev使用CurrentCulture的想法。

return number.ToString().Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) == false;

这不能解决epsilon问题(我最初没有考虑过)吗?

答案 8 :(得分:0)

我使用以下字符串扩展方法来检查RegEx模式

   public static bool IsInteger(this string inputString)
    {
        Regex regexInteger = new Regex(@"^[-]?\d+$");
        Match m = regexInteger.Match(inputString);
        return m.Success;
    }