77

私が呼び出すときMath.ceil(5.2)、リターンはdouble 6.0です。私の自然な傾向は、それMath.ceil(double a)がを返すだろうと考えることでしたlong。ドキュメントから:

ceil(double a)

double引数以上で、数学的な整数に等しい最小の(負の無限大に最も近い)値を返します。

しかし、結果が整数であるのに、なぜadoubleではなくaを返すのでしょうか。longその背後にある理由を理解することは、Javaをもう少しよく理解するのに役立つかもしれないと思います。longまた、にキャストすることで問題が発生するかどうかを判断するのに役立つ場合があります。

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

いつも私はそれがどうあるべきだと思いますか?問題のある境界ケースがいくつかあるのではないかと心配しています。

4

2 に答える 2

72

の範囲は。の範囲doubleよりも大きくなっていlongます。例えば:

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

Math.ceil返された場合、最後の行は何をすることを期待しますlongか?

非常に大きな値(正または負)では、数値は非常にまばらに分散されることに注意してください。したがって、私が何を意味するかを理解すると、整数より大きい次の整数xはなりません。x + 1

于 2011-09-02T17:28:34.163 に答える
14

doubleは。より大きくすることができますLong.MAX_VALUE。そのような値を呼び出すとMath.ceil()、同じ値を返すことが期待されます。ただし、longが返された場合、値は正しくありません。

于 2011-09-02T17:28:56.640 に答える