2011-09-02 10 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の範囲を超えています。例えば:Math.ceillongを返された場合は、最後の行が何を期待する何

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

数値が非常に大きい(正または負)場合、数値が非常にまばらに分布することに注意してください。つまり、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となるでしょう。 'long'として表現するには大きすぎる値は小数部を持たない。 –

関連する問題