在java中将double与int进行比较是不是有效?

Posted

技术标签:

【中文标题】在java中将double与int进行比较是不是有效?【英文标题】:Is it valid to compare a double with an int in java?在java中将double与int进行比较是否有效? 【发布时间】:2012-10-29 03:09:24 【问题描述】:
Utilities.getDistance(uni, enemyuni) <= uni.getAttackRange()

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

谢谢

【问题讨论】:

你试过了吗?成功了吗? 你自己试过了吗??一个简单的 java 代码测试就足够了。检查我的答案是否相同 它是有效的,但是如果你没有在双精度上指定精度,你可能会在极端情况下得到有趣的结果... 鉴于@PinnyM 的警告,我应该指出将int 转换为double 是无损的,但将long 提升为double 是有损的。也就是说,有一些long 类型的值不存在double 类型的确切值,因此转换会丢失信息。 intdouble 不是这样,intfloat 也是如此。 @NathanD.Ryan 是的,我实际上是在用正确的东西进行测试,但是以错误的方式简化了评论。与此同时,我用我的代码修复了另一个小问题,所以这是失败的最小长:long l = (1L &lt;&lt; 53) + 1; double d = l; System.out.println((long)d == l); 【参考方案1】:

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

查看链接到JLS section 5.6.2 (Binary Numeric Promotion)的JLS section 15.20.1 (Numerical Comparison Operators)。

来自后者:

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

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

...

【讨论】:

【参考方案2】:

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

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

【讨论】:

有趣的是这是我的教授代码。但是是的,我现在会调查这个主题 @Crone 对于学校作业,您可能可以忽略这些极端情况,但您仍然应该了解它们。选择忽略它们比完全无知要好。 我认为将double&lt;=&gt;=int 进行比较没有任何问题。只有完全相等可能是有问题的。 @MarkoTopolnik = 在某些情况下可能会产生不良结果,就像 == 一样。 “某些情况”并不像您想象的那么难以预测,在计算欧几里得距离时,它会完全没问题。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

int i =10;
double j= 10.0;
 if (i==j)

System.out.println("IT IS TRUE");

【讨论】:

【参考方案5】:

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

Major Bug img from sonarQube

Major Bug description from sonarQube

所以,正确的做法是,

Double.compare(val1,val2)==0 

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

【讨论】:

【参考方案6】:

会好的。

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

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

上面的代码打印为真。

【讨论】:

您必须小心(通常甚至避免)将浮点值与== 运算符进行比较。 你想将这两个值与什么进行比较? 所有ints 都可以完全表示为double

以上是关于在java中将double与int进行比较是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

java中两个Double型数据可以用(>,<,==,>=,<=)进行比较吗? 请详细说明

如何在linq where子句中将int与字符串进行比较[重复]

java中将一个double类型的数强制转换为long 型是四舍五入吗?

java中将一个double类型的数强制转换为long 型是四舍五入吗?

如何在Android中将double转换为int? [复制]

java中double与Integer直接比较大小是不是可以?