从 double 到 int 的可能有损转换并且找不到符号

Possible lossy conversion from double to int and cannot find symbol

我的程序出现错误:

Lyrics.java:11: error: cannot find symbol

 Cube(b);
 ^

symbol: method Cube(int)

location: class Lyrics

Lyrics.java:15: error: incompatible types: possible lossy conversion from double to int

 return Math.pow (b, 3);
                   ^

2 errors

我在网站上看了一圈,原来其他人也有这个问题,但我看了评论,我仍然不明白这个问题,我的代码中没有双重为什么会这样说。而且我也不理解错误说找不到符号。请帮助我真的坚持了一段时间。

  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);
       }
}

两个问题:

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

您可能应该将 cube() 更改为 return a double

然后你有更多的代码要写在 main 方法中以使用调用 cube.

的结果

第一个问题是一个简单的错字。 Java 区分大小写,因此 cubeCube 表示不同的意思。解决方案:1) 保持一致,以及 2) 使用以小写字母开头的名称作为方法名称......根据 Java 风格指南。


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

解决方案包括:

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

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

第二个通过 double return 转换为int 来直接解决您的编译错误。这是您告诉编译器有损转换实际上没问题的方式。

您看到的有损转换错误消息是指 b 的值足够大时,Math.pow(b, 3) 的结果将太大而无法表示为 int 1。类型转换到位后,Java 会将 "too large" 的浮点数转换为 Integer.MAX_VALUE.

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


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

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

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

或以上的变体。


1 - 实际上,编译器不知道 pow 的语义,所以它不知道 "... 对于足够大的值b ..."。但它确实知道如果方法调用 did return 一个足够大的值,那么转换 是有损的。这就是为什么消息说 "possible lossy conversion".