Здесь нет несоответствия: методы просто разработаны для выполнения различных спецификаций.
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. Хотя там есть много несоответствий - неизбежных, учитывая размер и масштаб этих библиотек - там также есть достаточное количество консенсуса.