Официальный Javadoc говорит, что Math.floor()
возвращает значение типа double
, равное "математическому целому числу", но тогда почему бы ему не вернуть int
?
Почему Math.floor возвращает двойник?
Ответ 1
По словам того же Javadoc:
Если аргумент равен NaN
или бесконечности, либо положительному нулю, либо отрицательному нулю, то результат совпадает с аргументом. Не могу сделать это с int
.
Наибольшее значение типа double
также больше, чем наибольшее значение типа int
, поэтому оно должно быть long
.
Ответ 2
Это для точности. Двойной тип данных имеет 53 бит мантиссы. Между прочим, это означает, что двойник может представлять все целые до 2 ^ 53 без потери точности.
Если вы храните такое большое число в целых числах, вы получите переполнение. Целые числа имеют только 32 бита.
Возвращение целого числа в виде двойника - это то, что нужно сделать здесь, потому что оно предлагает гораздо более широкий полезный диапазон чисел, чем целое число.
Ответ 3
Другие сказали вам, почему, я собираюсь рассказать вам, как правильно округлить, если вы хотите сделать это. Если вы собираетесь использовать только положительные числа, вы можете использовать это утверждение:
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);
}
Ответ 4
Что бы вы хотели, чтобы оно вернулось, если вы дали ему двойной размер больше, чем наибольший int или long?
(По общему признанию, если он будет больше, чем наибольший длинный, точность будет в любом случае низкой - это может быть не ближайшее теоретическое целое, но даже так...)
Ответ 5
Таким образом, ошибка и другие нецелые значения могут корректно каскадироваться с помощью серии вычислений.
Например, если вы подаете Not Not Number (NaN) в Math.floor, он пройдет его.
Если он вернет целое число, он не сможет передать эти состояния или ошибки вместе, и вы можете получить плохие результаты из более ранних вычислений, которые выглядят хорошо, но ошибочны после дальнейшей обработки.
-Adam
Ответ 6
Так же, как в Java существует целое число и деление с плавающей запятой, существуют полные и плавающие способы для создания пола:
double f = Math.floor(x);
или
int k = (int) x;
но вам всегда нужно быть осторожным с использованием пола с арифметикой с конечной точностью: ваш расчет x может привести к чему-то вроде 1.99999999, который будет перекрыт до 1, а не 2 в обеих формах. Существует много алгоритмов, которые должны обойти это ограничение, чтобы избежать неправильных результатов для некоторых входных значений.