【问题标题】:Determine if a variable is a float or an integer in java在java中确定变量是浮点数还是整数
【发布时间】:2021-05-14 19:30:46
【问题描述】:

我需要编写一个程序,它使用多个称为 average 的方法返回这些值的平均值,如果两者都是 int,则返回的值应该是 int,如果一个或多个是浮点数,则值应该是作为双精度返回。我不断遇到以下代码错误:

class Main
{
  class Unbruh{
  static int average(int x, int y)
  {
    return ((x + y) / 2);
  }
  static double average(double x, double y)
  {
    return ((x + y) / 2);
  }
}
  class Bruh
  {
  public static void main (String[] args)
  {

    System.out.println ("Enter number");
    Scanner input = new Scanner (System.in);
    float x = input.nextFloat ();
    float y = input.nextFloat ();
    System.out.println(Unbruh.average(x,y));
System.out.println(Unbruh.average(x,y));

    Unbruh a = new Unbruh ();
    a.average (x, y);
 // System.out.println (average (x, y));
 
  }

}
}

这里的逻辑有问题,还是只是格式错误?

【问题讨论】:

  • 只是格式化。将 Unbruh 类移到包含 main 的类之外。看我的例子。 Bruh 应该公开。
  • “我不断遇到以下代码错误”什么错误?编译时间?运行时间?
  • Katzerax,如果这些答案中的任何一个有帮助,请考虑对其进行投票。此外,如果其中之一对您来说很突出并解决了您的问题,请将其标记为正确答案。您可能没有足够的声誉来投票。如果是这样,那很好。

标签: java floating-point integer


【解决方案1】:

方法 main 不能声明为 static;静态方法只能在静态或顶级类型中声明。

这来自于在另一个类中的一个类中声明一个静态方法。其他类不被视为顶级类。

我修改了代码以演示重载将根据参数类型选择正确的方法。这意味着使用整数或浮点数调用方法。使用单个浮点数并调用 float 方法。使用两个整数,会调用int 方法。

注意:(这很重要)。如果提示输入整数或输入整数并分配给浮点数,则将调用浮点方法。即使您提示输入浮点数并输入1020,也会调用浮点方法。这与您输入的内容无关,而是与分配值的类型有关。

检查是否存在小数以确定用户是否想要使用浮点数将不起作用,因为Scanner.nextFloat()Float.parseFloat() 都将接受无小数点的值。两者都不会抛出异常。因此,无法确定用户的实际意图。而且imo,强迫用户提供小数点是不合理的。

我的建议是将以下代码直接放入名为Bruh.java 的文件中。我没有理由认为这应该阻止它像我自己那样工作。抱歉,您一直在为这个问题苦苦挣扎。

import java.util.Scanner;

class Unbruh {
    static int average(int x, int y) {
        System.out.println("Calling int version");
        return ((x + y) / 2);
    }
    
    static float average(float x, float y) {
        System.out.println("Calling float version");
        return ((x + y) / 2);
    }
}

public class Bruh {
    public static void main(String[] args) {
        
        System.out.println("Enter two float numbers.");
        Scanner input = new Scanner(System.in);
        float x = input.nextFloat();
        float y = input.nextInt(); // converted to a float
        float floatResult = Unbruh.average(x, y);
        System.out.println(floatResult);

        System.out.println("Enter two int numbers.");
        int xx = input.nextInt();
        int  yy = input.nextInt();
        int intResult = Unbruh.average(xx, yy);
        System.out.println(intResult);
        
        x = xx; // converting int to float
        y = yy; // converting int to float
        // float method will be called.
        
        floatResult = Unbruh.average(x,y);
        System.out.println(floatResult);
    }
}

这是一个会话的样子

Enter two float numbers.
10 20                         <-- user input
Calling float version
15.0
Enter two int numbers.
10 40                         <-- user input
Calling int version
25
Calling float version
25.0

【讨论】:

  • 收到错误The public type Bruh must be defined in its own file。这可能是 drjava 的限制吗?
  • 不。这是 Java 的要求。所以只需将文件重命名为Bruh.java,它应该可以工作。另一个不公开的类可能仍然在同一个文件中。每个文件只允许一个公共外部类。如果有一个静态主入口点,那就是必须包含它的那个。
  • 好的,重命名文件,运行它会导致一些相同的错误:The method main cannot be declared static; static methods can only be declared in a static or top level type。这发生在程序中的所有静态实例
  • 我修改了我的声明,因为它没有按我的意思解释。
【解决方案2】:

要确定一个数字是整数还是浮点数,您应该将该数字读取为字符串。在这种情况下,您将数字读取为浮点数,这可能无法确定您想要的内容(或者也许有一种方法可以实现您的代码,我不知道)。 因此,如果您将该行作为字符串读取并检查它是否包含.,如果包含,那么这是一个浮点数,但在这里,您必须小心,因为如果您输入 任何字符串,当String转换为Float或Integer时会引发NumberFormatException。

你可以在你的代码中尝试这样的事情:

import java.util.Scanner;

class Unbruh {
    static int average(int x, int y) {
        System.out.println("Integer numbers");
        return ((x + y) / 2);
    }
    
    static float average(float x, float y) {
        System.out.println("Float numbers");
        return ((x + y) / 2);
    }
}

public class Bruh {
    public static void main(String[] args) {
        
        System.out.println("Enter number");
        Scanner input = new Scanner(System.in);
        String x = input.next();
        String y = input.next();
        
        if(x.contains(".") || y.contains("."))
        {
            System.out.println(Unbruh.average(Float.parseFloat(x), Float.parseFloat(y)));
        }
        else{
            System.out.println(Unbruh.average(Integer.parseInt(x), Integer.parseInt(y)));
        }
        
        Unbruh a = new Unbruh();
        if(x.contains(".") || y.contains("."))
        {
            System.out.println(a.average(Float.parseFloat(x), Float.parseFloat(y)));
        }


        else{
            System.out.println(a.average(Integer.parseInt(x), Integer.parseInt(y)));
        }
        // System.out.println (average (x, y));
        
    }
}

关于您的代码,您有一点警告,因为您有 a.average(...) 其中 a 是 Unbruh 类的一个实例。但是,该类中的方法是静态的,因此,没有必要使用不推荐的a.average(...)。 对于静态方法,标识符必须使用以下语法:

className.static_method(...)

在这种情况下,在您的代码中,您在以下行中具有该语法:

Unbruh.average(...)

如果您看到,您使用的是名称类 Unbruh,然后是静态方法

PD:当我说您输入 任何字符串 都会导致 NumberFormatException 我的意思是,如果您输入像 "fuzz" 这样的字符串,则会导致错误,但是如果输入"10"或者"20.5"是正确的,所以在使用parse方法的时候不会抛出NumberFormatException

【讨论】:

  • 仅使用此代码,并将您的文件命名为 Bruh.java 才能正常工作。
  • @Katzerax 我没有收到任何错误。也许是我拥有的java版本。我已经在 java 11 中编译并且它可以工作,但是,我想这也适用于 java 8。请检查您的 java 版本是 java 8 还是主要版本。看到这个question 可能会对你有所帮助。
【解决方案3】:

您的问题是,无论您从控制台输入什么(即 4 2 或 4.0 2.0),事实是您将它们捕获为浮点数,并且将调用相同的方法(返回浮点数的方法) .

我这样做的方法是将数字保留为字符串,并创建一个评估输入字符串并根据字符串模式评估它们的方法。如果字符串包含句点,则假定它是浮点数。如果不是,假设它是一个整数。如果您尝试将字符串转换为数字并且它不是数字,则该方法将抛出 NumberFormatException

将字符串转换为数字后,如果两个数字都是整数,则返回一个整数。否则,返回双倍。您可以通过简单地使用isFloat 标志来记住这一点,以记住至少有一个输入是浮点数。解决方案如下,并不复杂。

public Number average(String x, String y) throws NumberFormatException {
    
    Number d1;
    Number d2;
    boolean isFloat = false;
    
    if (x.contains(".")) {
        d1 = Double.parseDouble(x);
        isFloat = true;
    } else {
        d1 = Integer.parseInt(x);
    }
    
    if (y.contains(".")) {
        d2 = Double.parseDouble(y);
        isFloat = true;
    } else {
        d2 = Integer.parseInt(y);
    }
    
    if (isFloat) {
        return (d1.doubleValue() + d2.doubleValue()) / 2.0;
    }
    
    return (d1.intValue() + d2.intValue()) / 2;
  }
}

public class Bruh {
  public static void main(String[] args) {
  
    System.out.println("Enter number");
    Scanner input = new Scanner(System.in);
    String x = input.next();
    String y = input.next();
    input.close();
    Unbruh a = new Unbruh();
    System.out.println(a.average(x, y));
  }
}

使用修改后的Bruh 类的输出:

4
2
3

4.0
2.0
3.0

4.0
2
3.0

4
2.0
3.0

【讨论】:

  • @Katzerax 我没有收到任何错误。试试我修改后的Bruh
  • 我得到“方法包含(java.lang.CharSequence)从类型 java.lang.String 引用缺少的类型 java.lang.CharSequence”作为每个 if 语句的错误,有解决办法吗?
  • @Katzerax,您的 Bruh 类应该替换为我的,Unbruh 类应该包含一个 average 方法,这是我在这篇文章中展示的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2012-08-19
  • 2014-10-01
相关资源
最近更新 更多