【问题标题】:Possible lossy conversion from double to int and cannot find symbol [duplicate]从 double 到 int 的可能有损转换并且找不到符号 [重复]
【发布时间】:2016-03-23 07:41:24
【问题描述】:

我的程序出现错误提示:

Lyrics.java:11: 错误:找不到符号

 Cube(b);
 ^

符号:方法 Cube(int)

地点:类歌词

Lyrics.java:15: 错误:不兼容的类型:可能有损从 double 到 int 的转换

 return Math.pow (b, 3);
                   ^

2 个错误

我在网站上环顾四周,结果发现其他人也有这个问题,但我查看了 cmets,但我仍然不明白问题所在,我的代码中没有重复,为什么会这样说。而且我也不明白错误说找不到符号。请帮助我真的被困了一段时间。

  import static java.lang.Math.pow;
  import java.util.Scanner;

  public class Lyrics
  {
       public static void main(String []args)
       {
            int b;
            Scanner scan = new Scanner(System.in);
            System.out.println ("Enter a number: ");
            b = scan.nextInt();
            Cube(b);
       }
       public static int cube (int b)
       {
            return Math.pow (b, 3);
       }
}

【问题讨论】:

  • 非常感谢,但是你明白另一个错误吗?

标签: java int double


【解决方案1】:

第一个问题是一个简单的错字。 Java 区分大小写,所以cubeCube 表示不同的东西。解决方案:1) 保持一致,2) 使用以小写字母开头的名称作为方法名称...按照 Java 样式指南。


第二个问题是由于Math.pow的方法签名;见javadoc。它将结果作为double 返回。然后您尝试将double 作为int 返回,而 是有损转换。

解决方案包括:

  return b * b * b;   // i.e. don't use `pow`.

  return (int) Math.pow(b, 3);

第二个通过强制转换double 返回到int 直接解决您的编译错误。这是你告诉编译器有损转换实际上没问题的方式。

您看到的有损转换错误消息指的是,对于足够大的 b 值,Math.pow(b, 3) 的结果将太大而无法表示为 int1 .类型转换到位后,Java 会将“太大”的浮点数转换为 Integer.MAX_VALUE

第一个解决方案是更快更简单的代码,但是如果b太大,计算会默默溢出,你会得到一个无意义的答案。


更新 - 如果您希望溢出始终被视为错误,那么:

return Math.multiplyExact(b, Math.multiplyExact(b, b));

return Math.toIntExact((long) Math.pow(b, 3));

或以上的变体。


1 - 实际上,编译器不知道 pow 的语义,所以它不知道 "...对于足够大的 b 值..." 。但它确实知道,如果方法调用确实返回了足够大的值,那么转换是有损的。这就是为什么消息说可能有损转换”

【讨论】:

    【解决方案2】:

    两个问题:

    1. 字母大小写很重要:Cubecube 不同。
    2. 您的函数cube(int) 返回一个整数,但Math.pow 的输出是double

    您可能应该更改cube() 以返回double

    那么你有更多的代码要写在main方法中来使用调用cube的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2014-08-02
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多