关于java:可能有损转换从double到int并且找不到符号

Possible lossy conversion from double to int and cannot find symbol

本问题已经有最佳答案,请猛点这里访问。

我的程序出现错误,说:

Lyrics.java:11: error: cannot find symbol

1
2
 Cube(b);
 ^

symbol: method Cube(int)

location: class Lyrics

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

1
2
 return Math.pow (b, 3);
                   ^

2 errors

我在网站上四处看看,结果发现其他人也有这个问题,但我看了评论,我仍然不理解这个问题,我的代码没有双重含义,为什么它会说这个。我也不否认"找不到符号"这个错误。请帮帮我,我真的有一段时间都在忙这个了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  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是区分大小写的,所以EDOCX1 0和EDCX1 0是不同的。解决方案:1)保持一致,2)使用以小写字母开头的名称作为方法名称…按照Java样式指南。

第二个问题是由于Math.pow的方法签名;请参阅javadoc。它以double的形式返回结果。然后您尝试将double作为int返回,这是一个有损转换。

解决方案包括:

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

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

第二种方法通过将double返回到int直接解决编译错误。这就是告诉编译器有损转换实际上是正常的方法。

您看到的有损转换错误消息是指,对于足够大的b值,Math.pow(b, 3)的结果太大,无法表示为int1。使用类型转换,Java将一个"太大"的浮点数转换成EDCOX1(20)。

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

更新-如果希望始终将溢出视为错误,则:

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

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

或以上的变化。

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


两个问题:

  • 字母大小写很重要:CubeCube不同。
  • 函数cube(int)返回一个整数,但Math.pow的输出是一个double
  • 您可能应该更改cube()以返回double

    然后在main方法中编写更多的代码来使用调用Cube的结果。