Каков самый быстрый способ (метод), чтобы проверить, если double является int и как решить? - PullRequest
0 голосов
/ 22 сентября 2018

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

public boolean isSquareNumber(){

        double nd = Math.sqrt(num); // num is a class member variable.

        if(nd == Math.floor(nd))
        {
            return true;
        } else {
            return false;
        }
    }

и этот метод

 public boolean isSquareNumber(){

        double nd = Math.sqrt(num);

        if(nd == (int)Math.sqrt(nd))
        {
            return true;
        } else {
            return false;
        }
    }

Math.floor () и Math.sqrt ().оба были одинаковы для этой ситуации, но как я могу решить, что быстрее?

Спасибо за ваше время <3. </p>

1 Ответ

0 голосов
/ 22 сентября 2018

Самый быстрый способ проверить, является ли значение 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 для целей округления.

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