Почему 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()
на такое значение, вы ожидаете вернуть одно и то же значение. Однако, если он вернет длинный, значение будет неверным.