Почему Math.round возвращает длинный, а Math.floor возвращает двойной?

Почему несогласованность?

34
задан Jonathan Leffler 22 August 2014 в 02:54
поделиться

1 ответ

Здесь нет несоответствия: методы просто разработаны для выполнения различных спецификаций.

  • long round(double a)
    • Возвращает ближайшее long к аргументу.
  • double floor(double a)
    • Возвращает наибольшее (ближайшее к положительной бесконечности) значение double, которое меньше или равно аргументу и равно целому математическому числу.
    • Сравните с double ceil(double a)
  • double rint(double a)
    • Возвращает значение double, которое ближе всего по значению к аргументу и равно целому математическому числу

Таким образом, по замыслу round округляет до long, а rint - до double. Так было всегда, начиная с JDK 1.0.

Другие методы были добавлены в JDK 1.2 (например, toRadians, toDegrees); другие были добавлены в 1. 5 (например, log10, ulp, signum и т.д.), и еще некоторые были добавлены в 1.6 (например. copySign, getExponent, nextUp и т.д.) (ищите метаданные Since: в документации); но round и rint всегда были друг у друга такими, какие они есть сейчас, с самого начала.

Спорно, возможно, вместо long round и double rint было бы более "последовательным" назвать их double round и long rlong, но это спорно. Тем не менее, если вы настаиваете на том, чтобы категорически назвать это "несоответствием", то причина может быть такой же неудовлетворительной, как "потому что это неизбежно".

Вот цитата из Effective Java 2nd Edition, Item 40: Design method signatures carefully:

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

Отдаленно связанные вопросы

17
ответ дан 27 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: