当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《可能有损转换从double到int并且找不到符号》经验,为你挑选了1个好方法。

我的程序中出现错误:

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

 Cube(b);
 ^

符号:方法Cube(int)

location:class歌词

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

Stephen C.. 6

第一个问题是简单的拼写错误.Java是大小写敏感的,所以cubeCube意味着不同的事情.解决方案:1)保持一致,2)根据Java样式指南使用以小写字母开头的方法名称...


第二个问题是由于方法签名Math.pow; 看到javadoc.它返回结果为a double.然后你尝试返回doubleas int,是一个有损转换.

解决方案包括:

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

要么

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

第二个通过将返回值转换为a 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......的值".但它确实知道如果方法调用确实返回足够大的值,那么转换是有损的.这就是消息说" 可能有损转换"的原因.



1> Stephen C..:

第一个问题是简单的拼写错误.Java是大小写敏感的,所以cubeCube意味着不同的事情.解决方案:1)保持一致,2)根据Java样式指南使用以小写字母开头的方法名称...


第二个问题是由于方法签名Math.pow; 看到javadoc.它返回结果为a double.然后你尝试返回doubleas int,是一个有损转换.

解决方案包括:

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

要么

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

第二个通过将返回值转换为a 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......的值".但它确实知道如果方法调用确实返回足够大的值,那么转换是有损的.这就是消息说" 可能有损转换"的原因.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有