2010-11-02 89 views
18

Possible Duplicate:
How to determine if a decimal/double is an integer?什么是一个很好的方法来检查一个double是否是C#中的整数?

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

目前,我有

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

有没有更好的办法?

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

+8

您的方式是有风险的:如果机器区域设置具有“,”作为小数点分隔符?看起来你可以从下面的答案中选择。 :) – 2010-11-02 11:44:52

+0

使用当前使用的方法时首先想到的是,它可能不会考虑到小数点分隔符可能会因当前线程文化的不同而不同。如果您要从下面的答案中选择其中一种方法,请注意在给出结果之前将输入数字视为字符串的任何内容......特别是如果它没有考虑除“。”之外的小数点分隔符。 – 2010-11-02 11:50:52

+0

@Shadow:您可以使用'CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator'来改变您的情况。但是((十进制))Int32.MaxValue + 1)'?这是一个没有小数点的小数点 – abatishchev 2010-11-02 12:06:16

回答

29
return Math.Truncate(number) == number; 

正如在评论中提到,你可能需要采取的事实,你的电话号码的double表示可能不是一个准确的整数账户。在这种情况下,你需要允许一些保证金的错误:

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

但是,请注意浮点精度问题:使用'double number = 100.0 *(8183.23 - 6695.37)',您将使用此方法获得'false'。 – 2010-11-02 12:20:52

6

尝试:

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

或者越漂亮:

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

为什么你把int重新翻倍? – nawfal 2013-01-13 00:07:39

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

这在double double值较大的情况下不起作用,double的值范围大于int值。 TryParse会因为范围而给你虚假,但你的MOD将返回true。试试看double.MaxValue – BrokenGlass 2010-11-02 11:53:50

+0

感谢您的注意,更新了我的答案。 – 2010-11-02 12:01:25

+0

@BrokenGlass,@Tim:问题说“整数”,而不是“int”或“Int32”。 Tim的原始逻辑是正确的,因为它与OP在该问题中尝试的内容相匹配,对于任何整数“double”返回true,否则返回false。 (理想情况下OP应该澄清它们是否意味着'Int32'或者只是整数。) – LukeH 2010-11-02 12:07:03

4

我会使用TryParse

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

我使用的检查对正则表达式的模式下面的字符串扩展方法

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

这在包括溢出在内的许多情况下不起作用,double的值范围大于int的值。你现在有两个问题。 – BrokenGlass 2010-11-02 11:50:34

+0

公平评论 - 同意 – Madeleine 2010-11-02 12:09:34

+1

当负数不表示为-1时,这也会失败吗?(1)? – 2010-11-02 14:13:30

15

与字符串表示工作的缺陷是所使用的语言环境和yoou必须采取的四舍五入问题护理。在大多数情况下,0.999999999可以被认为是整数1。这里是一个小片段考虑舍入误差:

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

其中EPSILON是双值足够小,你的目的0.00001例如也该

见一些更多的信息:http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx

+5

提及epsilon +1。 – Polyfun 2010-11-02 12:02:20

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

数字== Math.Truncate(数字)如何? – JohannesH 2010-11-02 12:14:08

2

我认为一个更好的问题是:如何判断一个double是否足够接近一个整数以符合我的目的?否则,你必然会遇到歧义。所以我建议这样的事情:

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

我喜欢abatishchev的想法使用CurrentCulture。

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

难道这不能解决epsilon问题(我甚至没有考虑最初)?

相关问题