2011-09-02 94 views
64

當我撥打Math.ceil(5.2)時,退貨是double6.0。我的自然傾向是認爲Math.ceil(double a)將返回long。從文檔:爲什麼Math.ceil返回一個double?

ceil(double a)

返回最小的(最接近負無窮大)double值 不是小於該參數,並等於一個數學 整數。

但爲什麼返回double而非long時,結果是整數?我認爲理解它背後的原因可能會幫助我更好地理解Java。這也可能幫助我弄清楚,如果我將自己陷入困境,投擲到long,例如,是

long b = (long)Math.ceil(a);

總是什麼,我認爲它應該是什麼?我擔心可能會出現一些有問題的邊界案例。

+0

查看http://stackoverflow.com/questions/3412449/why-does-math-round-return-a-long-but-math-floor-return-a-double – starblue

回答

61

double的範圍大於long的範圍。例如:

double x = Long.MAX_VALUE; 
x = x * 1000; 
x = Math.ceil(x); 

您所期待的最後一行做什麼,如果Math.ceil返回long

請注意,在非常大的值(正值或負值)時,數字最終會非常稀疏地分佈 - 因此,如果您明白我的意思,那麼大於整數x的下一個整數將不是x + 1

+0

我想你的最後一句話是談論精度的鬆散,但我認爲這並不取決於數字的高低,而是取決於它的有效位數(二進制)。我會盡力找到一個例子。 – aalku

+0

@ user270349:隨着值變大,連續double值之間的絕對間隔變大。有效位數的數字保持不變(除了低於正常數字)。 –

+2

示例:'2^60'可以表示爲double,而'2^60(+/-)1'不能表示 – aalku

13

雙倍可以大於Long.MAX_VALUE。如果您致電Math.ceil()這樣的價值,你會期望返回相同的價值。但是,如果它返回很長時間,則值將不正確。

+0

大於'Long.MAX_VALUE'的'double'值可能不會完全表示,因此'ceil(big_double)'的'double'結果不會是'big_double + 1'。所以它仍然是不正確的...... –

+0

@CiprianTomoiaga你是對的,它不會是big_double +1,因爲這將是big_double。任何太大的值都不能表示爲「長」,沒有小數部分。 –

相關問題