2010-11-02 91 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問題(我甚至沒有考慮最初)?

相關問題