Почему Math.ceil возвращает двойное число? - PullRequest
71 голосов
/ 02 сентября 2011

Когда я звоню 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);

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

Ответы [ 2 ]

66 голосов
/ 02 сентября 2011

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

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

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

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

13 голосов
/ 02 сентября 2011

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

...