首页 > 解决方案 > 这个错误是什么意思?“错误:不兼容的类型:从 double 到 int 的可能有损转换”我的语法有问题吗?

问题描述

这是一个计算费马大定理的 java 程序:费马大定理说没有整数 a 、 b 和 c 使得

a n +b n =c n

除非 n≤2 。

编写一个名为 Fermat.java 的程序,输入四个整数(a、b、c 和 n)并检查 Fermat 定理是否成立。如果 n 大于 2 并且 a n +b n =cn  程序应该显示

“天哪,费马错了!”</p>

否则程序应该显示

“不,这行不通。”</p>

尝试将参数设置为fromcheckFermat没有成功。intdouble


这是我的代码:

import java.util.Scanner;

public class Fermat{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    
    checkFermat(1,2,4,1);
  }

  public static void checkFermat(int a,int b,int c,int n){
    int result = ((Math.pow (a,n))+(Math.pow(b,n)));
    if ((((Math.pow(a, n)) + (Math.pow(b, n))) == (Math.pow(c, n))) && ((n != 2))) {
      System.out.println("Holy smokes, Fermat was wrong!");
      
    }else{
      System.out.println("No, that doesn't work.");
    }
  }
}

这是错误:

code/Fermat.java:11: error: incompatible types: possible lossy conversion from double to int
    int result = ((Math.pow (a,n))+(Math.pow(b,n)));
                                  ^
1 error

标签: java

解决方案


您使用的方法位于java.lang.Math其中public static double pow(double, double)。它期望基数和指数都是类型double。由于隐式类型收敛形式int→在这种情况下(传递整数)工作正常double,因为 double 具有更高的层次结构、更多的字节数、更高的精度,因此可以存储更大范围的数字。

数据类型的层次结构

当您反转操作时,事情变得非常棘手。这其中可以注意到。

code/Fermat.java:11: error: incompatible types: possible lossy conversion from double to int
    int result = ((Math.pow (a,n))+(Math.pow(b,n)));
                                  ^
1 error

在这里,类型需要从double→转换,int因为返回类型Math.pow(double, double)是 type double。该类型应该是double任何其他数据类型,其层次结构位置比double. 不是,就准确性而言,存储值int远低于double并且可能导致数据丢失。也许返回值是一个浮点值,当涉及到整数但范围问题时,这是不可能的,一些数字平方可能需要一个非常大的值,无法存储在int其中,因此您看到的错误消息是通知您类型是不合适,可能会导致精度下降。

如何克服这一点?
1. 使用适当的数据类型
(推荐)按预期使用数据类型来保存返回的数据。
例如:double result = ((Math.pow (a,n))+(Math.pow(b,n)));

2. 显式类型转换
显式地说编译器从数据中向下转换doubleint不太关心数据。
例如:int result = (int)((Math.pow (a,n))+(Math.pow(b,n)));


推荐阅读