Почему Math.ceil возвращает двойной?

Когда я вызываю Math.ceil(5.2), возвращается double 6.0. Моей естественной склонностью было думать, что Math.ceil(double a) вернет a long. Из документации:

ceil(double a)

Возвращает наименьшую (ближайшую к отрицательной бесконечности) значение doubleчто не меньше аргумента и равно математическому целое число.

Но зачем возвращать double вместо long, когда результат является целым числом? Я думаю, что понимание причины этого может помочь мне понять Java немного лучше. Это также может помочь мне разобраться, попаду ли я в неприятности, добавив к long, например. это

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

всегда, что я думаю, что это должно быть? Я боюсь, что могут быть некоторые граничные случаи, которые являются проблематичными.

Ответ 1

Диапазон double больше, чем у long. Например:

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

Что бы вы ожидали от последней строки, если Math.ceil вернулся long?

Обратите внимание, что при очень больших значениях (положительных или отрицательных) числа в конечном итоге распределяются очень редко - поэтому следующее целое число больше целого x не будет x + 1, если вы увидите, что я имею в виду.

Ответ 2

Двойной может быть больше, чем Long.MAX_VALUE. Если вы вызываете Math.ceil() на такое значение, вы ожидаете вернуть одно и то же значение. Однако, если он вернет длинный, значение будет неверным.