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

时间:2015-12-17 00:00:14

标签: java int double

我的程序中出现错误:

  

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

 Cube(b);
 ^
     

symbol:method Cube(int)

     

location:class Lyrics

     

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

 return Math.pow (b, 3);
                   ^
     

2个错误

我在网站上四处看看,事实证明其他人也有这个问题,但我看了评论,我仍然不明白这个问题,我的代码中没有双重为什么会这样说。而且我也没有找不到错误,说找不到符号。请帮助我一直坚持这一点。

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

2 个答案:

答案 0 :(得分:5)

第一个问题是一个简单的拼写错误。 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)的结果将太大而无法表示为int 1 。使用类型转换,Java将转换一个太大的浮点数"进入Integer.MAX_VALUE

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

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

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

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

或以上的变体。

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

答案 1 :(得分:1)

两个问题:

  1. 信件案例很重要:Cubecube不一样。
  2. 您的函数cube(int)返回一个整数,但Math.pow的输出为double
  3. 您应该更改cube()以返回double

    然后,您需要在main方法中添加更多代码才能使用调用cube的结果。