2011-09-02 3 views
64

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

ceil(double a)

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

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

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

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

+0

См. Http://stackoverflow.com/questions/3412449/why-does-math-round-return-a-long-but-math-floor-return-a-double – starblue

ответ

61

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

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

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

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

+0

Я предполагаю, что в вашем последнем предложении вы находитесь говоря о свободной точности, но я думаю, что это не зависит от того, сколько из них число, а от количества значимых цифр (в двоичном формате). Я попытаюсь найти пример. – aalku

+0

@ user270349: Абсолютный зазор между последовательными двойными значениями становится больше по мере увеличения значения. Количество значимых цифр, представленных, остается неизменным (кроме как для ненормальных чисел). –

+2

Пример: '2^60' может быть представлен как двойной, а' 2^60 (+/-) 1' не может – aalku

13

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

+0

значения 'double', большие, чем' Long.MAX_VALUE', могут быть не представлены точно, поэтому результат 'double'' ceil (big_double) 'не будет' big_double + 1'. Так что это все еще некорректно ... –

+0

@CiprianTomoiaga вы правы, что это не будет big_double +1, поскольку это будет big_double. Любое значение, которое слишком велико, чтобы быть представленным как 'long', не имеет дробной части. –

Смежные вопросы