2009-10-15 48 views

回答

6

給一個嘗試Math.ceil

private static boolean isInt(double x) { 
    return x == Math.ceil(x); 
} 

編輯

我已經做了一些基準以下方法:

private static boolean isInt1(double x) { 
    return x == (int) x; 
} 

private static boolean isInt2(double x) { 
    return x == Math.ceil(x); 
} 

private static boolean isInt3(double x) { 
    return x % 1 == 0; 
} 

isInt1是他們的速度更快(上sunjre 1.6)

+0

jms,你現在可以改變你的投票。 – akf 2009-10-15 21:21:12

+0

Math.ceil速度更快嗎? - 如果是這樣,爲什麼?它在做什麼魔術? :-) – Adamski 2009-10-15 21:46:27

+0

+1我會使用Math.floor,但這並不重要。 – starblue 2009-10-16 05:28:13

3

,我不知道這是任何更快,但你可以投你double到int和測試平等:

double d = 123.456; 
boolean dIsAnInteger = (d == (int)d); 
+0

-1超過2^31時不起作用。使用long只會稍微錯誤一點。 – starblue 2009-10-16 05:27:10

1

警告:你會考慮0.9999999999999999整數?可能不會。但是看這個:

double val = 0; 
for(int i=0;i<10;i++) 
    System.out.println(val+=0.1); 

此打印出:

0.1 
0.2 
0.30000000000000004 
0.4 
0.5 
0.6 
0.7 
0.7999999999999999 
0.8999999999999999 
0.9999999999999999 

這是個問題,因爲在程序val結束包含您認爲應該是整數,但不是。

所以我會做我的方法有點通過整合增量像JUnit慢(但更正確的)作用:

private static boolean isInt(double x, double delta) { 
    double ceil = Math.ceil(x); 
    return x-delta<ceil && x+delta>ceil; 
} 

課程,並提供同樣的方法用一個合理的默認:

private static boolean isInt(double x) { 
    return isInt(x, 0.000000001); 
} 

現在isInt(val)終於返回true。

相關問題