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);
いつも私はそれがどうあるべきだと思う?問題のある境界ケースがいくつかあるのではないかと心配しています。
double
の範囲は、long
の範囲よりも大きくなっています。例えば:
double x = Long.MAX_VALUE;
x = x * 1000;
x = Math.ceil(x);
Math.ceil
がlong
を返した場合、最後の行はどうなりますか?
非常に大きな値(正または負)では、数値は非常にまばらに分布することに注意してください。つまり、意味がわかると、整数x
より大きい次の整数はx + 1
になりません。
Doubleは_Long.MAX_VALUE
_より大きくすることができます。そのような値でMath.ceil()
を呼び出すと、同じ値を返すことが期待されます。ただし、長い値が返された場合、値は正しくありません。