在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
类型的确切值,因此转换会丢失信息。 int
到 double
不是这样,int
到 float
也是如此。
@NathanD.Ryan 是的,我实际上是在用正确的东西进行测试,但是以错误的方式简化了评论。与此同时,我用我的代码修复了另一个小问题,所以这是失败的最小长:long l = (1L << 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 将执行隐式扩展转换。这意味着当您将double
与int
进行比较时,int
将转换为double
,以便Java 可以将这些值作为两个double
s 进行比较。所以简短的回答是肯定的,比较 int 和 double 是有效的,但需要注意。
问题是您不应该使用==
、<=
或>=
运算符比较两个浮点值的相等性,因为可能存在精度错误。此外,您需要注意 double 可以采用的特殊值:NaN
、POSITIVE_INFINITY
和 NEGATIVE_INFINITY
。我强烈建议您在比较double
s 时进行一些研究并了解这些问题。
【讨论】:
有趣的是这是我的教授代码。但是是的,我现在会调查这个主题 @Crone 对于学校作业,您可能可以忽略这些极端情况,但您仍然应该了解它们。选择忽略它们比完全无知要好。 我认为将double
与<=
或>=
与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);
上面的代码打印为真。
【讨论】:
您必须小心(通常甚至避免)将浮点值与==
运算符进行比较。
你想将这两个值与什么进行比较?
所有int
s 都可以完全表示为double
。以上是关于在java中将double与int进行比较是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章
java中两个Double型数据可以用(>,<,==,>=,<=)进行比较吗? 请详细说明
如何在linq where子句中将int与字符串进行比较[重复]
java中将一个double类型的数强制转换为long 型是四舍五入吗?
java中将一个double类型的数强制转换为long 型是四舍五入吗?