Допустимо ли сравнивать double с int в java?

Utilities.getDistance(uni, enemyuni) <= uni.getAttackRange()

Служебные программы.getDistance возвращает double и getAttackRange возвращает int. Приведенный выше код является частью if и он должен быть истинным. Так действительно ли сравнение?

спасибо

6 ответов


Да, это действительно будет способствовать int до double перед выполнением сравнения.

посмотреть JLS раздел 15.20.1 (операторы численного сравнения) какие ссылки JLS раздел 5.6.2 (бинарное числовое продвижение).

из последнего:

расширение примитивного преобразования (§5.1.2) применяется для преобразования одного или обоих операндов, как указано в следующих правилах:

  • Если один из операндов имеет тип double, другой преобразуется в double.

  • ...


при выполнении операций (включая сравнения) с двумя различными числовыми типами Java выполнит неявное расширяющее преобразование. Это означает, что при сравнении a double с int на int превращается в double Так что Java может сравнить значения как два doubles. Таким образом, короткий ответ-да, сравнение int и double действительно, с оговоркой.

проблема в том, что вы не должны сравнивать два значения с плавающей точкой для равенства используя ==, <= или >= операторы из-за возможных ошибок в точности. Кроме того, вы должны быть осторожны со специальными значениями, которые может принимать double: NaN, POSITIVE_INFINITY и NEGATIVE_INFINITY. Я настоятельно рекомендую вам сделать некоторые исследования и узнать об этих проблемах при сравнении doubles.


Это должно быть прекрасно. в операции с плавающей запятой / сравнения, если один аргумент плавающий / двойной затем другой, являющийся int, также повышается до того же.


да, это абсолютно допустимо сравнить int datatype и double datatype..

int i =10;
double j= 10.0;
 if (i==j)
{
System.out.println("IT IS TRUE");
}

все будет хорошо.

Java просто вернет true числового значения равно:

    int n = 10;
    double f = 10.0;
    System.out.println(f==n);

приведенный выше код выводит true.


Да, это действует, и ваш код должен работать, как ожидалось, без каких-либо сбоев, но это не лучшая практика, статические анализаторы кода, такие как SonarQube, показывают это как "главную" "ошибку",

основная ошибка img от sonarQube

основное описание ошибки от sonarQube

Итак, правильный способ сделать это может быть,

Double.compare(val1,val2)==0 

если какой-либо параметр не является переменной с плавающей запятой, они будут повышены до плавающей запятой.