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

可能重复:
如何确定十进制/双精度是否为整数?

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

目前我有

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

有没有更好的办法?

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

 return Math.Truncate(number) == number; 

如评论中所述,您可能需要考虑到您的数字的double表示可能不是精确整数的事实。 在这种情况下,您需要允许一些误差:

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

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

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

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

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

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

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

尝试:

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

或者更漂亮:

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

我使用TryParse :

  double value = 2.0; int number; bool result = Int32.TryParse(value.ToString(), out number); 
  public static bool CheckIfInteger(double number) { return number - Math.Truncate(number) == 0; } 

我认为一个更好的问题是:我如何判断double是否足够接近整数才能被视为整数? 因为否则,你一定会遇到歧义。 所以我推荐这样的东西:

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

我喜欢abatishchev使用CurrentCulture的想法。

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

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

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

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