为什么Math.ceil返回一个double?

当我调用Math.ceil(5.2) ,返回值是double 6.0 。 我的自然倾向是认为Math.ceil(double a)会返回一个long 。 从文档:

ceil(double a)

返回不小于参数的最小(最接近负无穷大) double值,它等于一个math整数。

但是当结果是一个整数时为什么返回一个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() ,您将会返回相同的值。 但是,如果它返回一个很长的时间,价值将是不正确的。