Почему Math.floor возвращает двойной? - PullRequest
88 голосов
/ 04 февраля 2009

Официальный Javadoc говорит , что Math.floor() возвращает double, что "равно математическому целому числу", но тогда почему бы ему не вернуть int?

Ответы [ 6 ]

73 голосов
/ 04 февраля 2009

По данным того же Javadoc:

Если аргумент NaN или бесконечность, либо положительный ноль, либо отрицательный ноль, то результат совпадает с аргументом. Не могу сделать это с int.

Наибольшее значение double также больше, чем наибольшее int, поэтому оно должно быть long.

14 голосов
/ 04 февраля 2009

Это для точности. Двойной тип данных имеет 53-битную мантиссу. Среди прочего это означает, что двойное число может представлять все целое до 2 ^ 53 без потери точности.

Если вы храните такое большое число в целом числе, вы получите переполнение. Целые числа имеют только 32 бита.

Возвращение целого числа в виде двойного числа - правильная вещь, потому что оно предлагает гораздо более широкий диапазон полезных чисел, чем целое число.

6 голосов
/ 11 октября 2013

Другие говорили вам, почему, я собираюсь рассказать вам, как правильно округлить, если вы хотите сделать это. Если вы собираетесь использовать только положительные числа, вы можете использовать это утверждение:

int a=(int) 1.5;

Однако (int) всегда округляется до 0. Таким образом, если вы хотите сделать отрицательное число:

int a=(int) -1.5; //Equal to -1

В моем случае я не хотел этого делать. Я использовал следующий код для округления, и он, кажется, хорошо обрабатывает все крайние случаи:

private static long floor(double a)
{
    return (int) Math.floor(a);
}
3 голосов
/ 04 февраля 2009

Что бы вы хотели, чтобы оно вернуло, если бы вы дали ему в два раза больше, чем самое большое int или long?

(Предположительно, если он больше, чем наибольшее длинное значение, точность все равно будет низкой - это может быть не самое близкое теоретическое целое число - но даже в этом случае ...)

0 голосов
/ 11 сентября 2013

Так же, как в Java есть целочисленное деление и деление с плавающей запятой, существуют целочисленные и с плавающей запятой способы построения пола:

double f = Math.floor(x);

или

int k = (int) x; 

но вы всегда должны быть осторожны с использованием пола с арифметикой конечной точности: ваш расчет x может дать что-то вроде 1.99999999, которое будет равно 1, а не 2 в обеих формах. Есть много алгоритмов, которые должны обойти это ограничение, чтобы избежать получения неправильных результатов для некоторых входных значений.

0 голосов
/ 04 февраля 2009

Так что ошибка и другие нецелочисленные значения могут правильно каскадироваться в серии вычислений.

Например, если вы введете Not a Number (NaN) в Math.floor, он передаст его.

Если он вернул целое число, он не мог передать эти состояния или ошибки, и вы могли бы получить плохие результаты из более ранних вычислений, которые выглядят хорошими, но неправильными после дальнейшей обработки.

-Adam

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...