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

Utilities.getDistance 返回 double 并且 getAttackRange 返回 int。上面的代码是 if 语句的一部分,它必须是真的。那么比较有效吗?

谢谢

4

6 回答 6

73

是的,它是有效的——它会在执行比较之前将 提升int为 a 。double

请参阅JLS 第 15.20.1 节(数字比较运算符),该节链接到JLS 第 5.6.2 节(二进制数字提升)

从后者:

加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

  • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。

  • ...

于 2012-11-08T20:28:42.200 回答
7

当使用两种不同的数值类型执行操作(包括比较)时,Java 将执行隐式扩展转换。这意味着当您将 adouble与a 进行比较时int,将int转换为 a double,以便 Java 可以将值作为两个doubles 进行比较。所以简短的回答是肯定的,比较一个 int 和一个 double 是有效的,但需要注意的是。

==问题是您不应该使用、<=或运算符比较两个浮点值是否相等,>=因为可能存在精度错误。此外,您需要注意 double 可以采用的特殊值:NaNPOSITIVE_INFINITYNEGATIVE_INFINITY. double我强烈建议您在比较s时进行一些研究并了解这些问题。

于 2012-11-08T20:32:17.600 回答
2

这应该没问题。在浮点运算/比较中,如果一个参数是浮点/双精度,那么另一个是 int 的参数也会被提升为相同参数。

于 2012-11-08T20:29:28.253 回答
2

是的,比较 int 数据类型和 double 数据类型是绝对有效的。

int i =10;
double j= 10.0;
 if (i==j)
{
System.out.println("IT IS TRUE");
}
于 2017-08-13T14:21:15.010 回答
2

是的,它有效,并且您的代码应该可以按预期工作而不会出现任何故障,但这不是最佳实践,像 SonarQube 这样的静态代码分析器将其显示为“主要”“错误”,

来自 sonarQube 的主要错误 img

来自 sonarQube 的主要错误描述

所以,正确的做法是,

Double.compare(val1,val2)==0 

如果任何参数不是浮点变量,它们将被提升为浮点。

于 2018-07-11T11:26:20.907 回答
0

一切都会安好的。

Java 将简单地返回 true 的数值是否相等:

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

上面的代码打印为 true。

于 2012-11-08T20:29:44.327 回答