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

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

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


person PengOne    schedule 02.09.2011    source источник
comment
См. stackoverflow.com/questions/3412449/   -  person starblue    schedule 02.09.2011


Ответы (2)


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

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

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

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

person Jon Skeet    schedule 02.09.2011
comment
Я предполагаю, что в своем последнем предложении вы говорите о потере точности, но я думаю, что это зависит не от числа, а от количества его значащих цифр (в двоичном формате). Попробую найти пример. - person aalku; 02.09.2011
comment
@ user270349: Абсолютный разрыв между последовательными двойными значениями увеличивается по мере увеличения значения. Количество представленных значащих цифр остается неизменным (кроме субнормальных чисел). - person Jon Skeet; 02.09.2011
comment
Пример: 2^60 может быть представлен как double, а 2^60 (+/-) 1 не может - person aalku; 02.09.2011
comment
Ты прав. Увеличение мантиссы на единицу означает гораздо большее число, если показатель степени большой, очевидный. - person aalku; 02.09.2011
comment
Но тогда почему round возвращает long? - person Zoltán; 29.08.2014
comment
^ Золтан, точно. Math.round возврат long несовместим с приведенными выше рассуждениями. - person Tim Harper; 26.05.2016

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

person Peter Lawrey    schedule 02.09.2011
comment
значения double, которые больше Long.MAX_VALUE, могут быть представлены неточно, поэтому double результат ceil(big_double) не будет big_double + 1. Так что все равно неверно ... - person Ciprian Tomoiagă; 17.03.2017
comment
@CiprianTomoiaga, вы правы, что это не будет big_double +1, так как это будет big_double. Любое значение, которое слишком велико для представления в виде long, не имеет дробной части. - person Peter Lawrey; 19.03.2017