2012-09-10 24 views
2

下面我試圖指定value的最大值,然後向其添加可能的最小正值Double值。Java 6 - 創建並檢測Long.MAX_VALUE以上的第一個double值

我再嘗試檢測值大於最大Long值。

Double value = new Long(Long.MAX_VALUE).doubleValue(); 
value += Double.MIN_VALUE; 
if (value < -(new Long(Long.MAX_VALUE).doubleValue()) || value > new Long(Long.MAX_VALUE).doubleValue()) { 
    // Expecting code here to execute, but it doesn't. 
} 

研究涉及的值表明value具有

9.223372036854776E18 
= 9223372036854776000 

Long.MAX_VALUE具有

9223372036854775807 

比較這些顯示,value大於預期值的最終值:

9223372036854776000 (value) 
9223372036854775807 (Long.MAX_VALUE) 

可能有人請解釋爲什麼if聲明未能檢測到這一點?

真誠的感謝。

+2

如果你想要下一個更高的double值,可以使用Math.nextUp((double)Long.MAX_VALUE)。 –

回答

4

Long.MAX_VALUE不能準確地表示爲double。最接近的可用double值是9223372036854775808

Double.MIN_VALUE添加到該數字(10^-1074)不會更改任何內容,因爲與9223372036854775808 + 10^-1074最接近的雙精度值仍然是9223372036854775808

使用@ PeterLawrey的代碼,可以看到下一個可用的雙精度爲9223372036854777856(相當於Long.MAX_VALUE + 2048)。

注意:您的雙倍實際上等於9223372036854775808,其獲得印刷9.223372036854776E18。你可以用下面的代碼來看它:

double d = Long.MAX_VALUE; 
BigDecimal bd= new BigDecimal(d); 
System.out.println(bd); 
+0

感謝您的編輯,使您的原始回覆更徹底。非常感激。 – KomodoDave

3

添加一個很小的值,以較大的值是一樣的添加什麼。

我懷疑你腦子裏想的是

double d = Long.MAX_VALUE; 
// get the next represented value. 
double d1 = Double.longBitsToDouble(Double.doubleToLongBits(d)+1); 
System.out.println(d > Long.MAX_VALUE); 
System.out.println(d1 > Long.MAX_VALUE); 

打印

false 
true 
+0

非常感謝您提供正確的實施。嚴格地說,assylias回答了我問的問題 - '爲什麼如果失敗'。但我也默默希望正確的解決方案,所以歡呼:) – KomodoDave

+0

我剛剛找到了一個更簡單的方法來實現這一點。將任何浮點與任何非f.p。組合或組合兩個f.p.時,可以使用以下模式。 :'double value =(double)Long.MAX_VALUE; value + = Math.ulp(value);'這是我在這裏收到的迴應的禮貌:http://stackoverflow.com/questions/12356793/java-6-creating-and-detecting-the-first-double-value上限 - 浮動 - 最大值 – KomodoDave

+0

新獲勝者:'Math.nextUp(value)'。請參閱我之前的評論中的主題鏈接。 – KomodoDave

相關問題