【问题标题】: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);

标签: java comparison int double primitive-types


【解决方案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
          猜你喜欢
          • 1970-01-01
          • 2020-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-29
          • 2015-10-20
          • 1970-01-01
          相关资源
          最近更新 更多