Самый быстрый способ проверить, является ли значение double
целым числом, будет следующим:
double d = ...
if (d == ((long) d)) {
// It is an integer
}
Обратите внимание, что (теоретически) возможно для sqrt(someValue)
для получения double
значение, которое неотличимо от целочисленного значения, даже если истинный квадратный корень из someValue
не является целым числом.Поскольку javadoc заявляет:
В противном случае результатом является двойное значение ближайший к истинному математическому квадратному корню значения аргумента.
Таким образом, вы могли бы получить случай, когда «ближайшее» двойное значение соответствует целому числу, даже если фактический квадратный корень иррациональный.
Другой вопрос - является ли Math.floor
на самом деле правильно.
С одной стороны, сужение и 1025 * различны:
- сужение использует IEE 754 режим "округления до нуля"
Math.floor()
возврат «наибольшее (ближайшая к положительной бесконечности) значение с плавающей точкой, которое меньше или равно аргументу и равно математическому целому числу» .Другими словами, оно округляется до отрицательной бесконечности.
С другой стороны, если мы проверяем значение double
, которое, как известно, неотрицательно 1 , тоокругление к нулю и к отрицательной бесконечности - это одно и то же.
1 - Так ли это для Math.sqrt()
?Строго нет, поскольку sqrt(-0.0)
определено как возвращающее -0.0
... для Javadoc.Однако -0.0
следует рассматривать как +0.0
для целей округления.