从 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);
}
}
两个问题:
- 字母大小写很重要:
Cube
与 cube
不同。
- 您的函数
cube(int)
return 是一个整数,但 Math.pow
的输出是 double
。
您可能应该将 cube()
更改为 return a double
。
然后你有更多的代码要写在 main
方法中以使用调用 cube
.
的结果
第一个问题是一个简单的错字。 Java 区分大小写,因此 cube
和 Cube
表示不同的意思。解决方案: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".
我的程序出现错误:
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);
}
}
两个问题:
- 字母大小写很重要:
Cube
与cube
不同。 - 您的函数
cube(int)
return 是一个整数,但Math.pow
的输出是double
。
您可能应该将 cube()
更改为 return a double
。
然后你有更多的代码要写在 main
方法中以使用调用 cube
.
第一个问题是一个简单的错字。 Java 区分大小写,因此 cube
和 Cube
表示不同的意思。解决方案: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".