web-dev-qa-db-ja.com

Math.ceilがdoubleを返すのはなぜですか?

Math.ceil(5.2)を呼び出すと、double _6.0_が返されます。私の自然な傾向は、Math.ceil(double a)longを返すと考えることでした。ドキュメントから:

ceil(double a)

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

しかし、結果が整数であるときにdoubleではなくlongを返すのはなぜですか?その背後にある理由を理解することで、Javaが少し良くなります。long 、たとえば

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

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

71
PengOne

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

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

Math.ceillongを返した場合、最後の行はどうなりますか?

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

66
Jon Skeet

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

13
Peter Lawrey