【问题标题】:How do I accept and output both Doubles and Ints in an Array?如何接受和输出数组中的双精度和整数?
【发布时间】:2017-07-12 00:50:25
【问题描述】:
import java.util.Scanner;

public class PeopleWeights {

   public static void main(String[] args) {

     Scanner scnr = new Scanner(System.in);

     final int NUM_VALS = 5;

     int [] personsWeight = new int[NUM_VALS];

     int i = 0;

     for (i = 0; i < NUM_VALS; ++i) {
     System.out.print("Enter weight " + (i + 1) + ": ");
     System.out.println();
     personsWeight[i] = scnr.nextInt();
     }

     double sumVal = 0.0;

     for (i = 0; i < NUM_VALS; ++i) {
        sumVal = sumVal + personsWeight[i];
     }

     double avgVal = 0.0;

     for (i = 0; i < NUM_VALS; ++i) {
        avgVal = sumVal / NUM_VALS;
     }

     double maxVal = 0.0;

     for (i = 0; i < NUM_VALS; ++i) {
        maxVal = personsWeight[0];
        if (maxVal < personsWeight[i]) {
           maxVal = personsWeight[i];
        }
     }

     System.out.println();
     System.out.println(personsWeight[1] + " " + personsWeight[2] + " " 
     + personsWeight[3] + " " + personsWeight[4] + " " + personsWeight[5]);
//I know that this can be cleaner but this is where the 
//problem occurs with a InputMismatchException. 
//I know it's caused by the double being introduced 
//but don't know how to fix it.


     System.out.println("Total weight: " + sumVal);

     System.out.println("Average weight: " + avgVal);

     System.out.println("Max weight: " + maxVal);

     return;
  }
}

输入如下: 236, 89.5 , 142, 166.3 , 93.

我想像输入一样处理输出数字。 Double 或 Int。

无论如何我可以让阵列在扫描仪中接受这两种类型的数字,还是我必须采用另一种工作方式?

【问题讨论】:

  • 正常情况是将所有内容都视为double。您可以毫无问题地将 236 存储在 double 中。为什么将其保留为整数很重要?将其保留为双精度会有什么不良后果?
  • 另外,InputMismatchException 发生在这条线上:personsWeight[i] = scnr.nextInt();,与数组类型无关。它与在其中包含小数的输入上使用 nextInt() 有关。

标签: java arrays printing int double


【解决方案1】:

我认为解决这个问题的最简单方法是从Scanner 中获取 String 对象,然后在需要时将它们转换为它们的实际类型(如果 String 包含句点,您可以检测到它是双精度)将它们的值用于任何计算。

【讨论】:

    【解决方案2】:

    您可以使用Scanner 类的hasNextInt()hasNextDouble() 方法初步确定输入的数字是Double 还是Integer。

    if (scnr.hasNextInt()) {
        int n = scnr.nextInt();
        //your code to handle `integer` case
    }
    else if(scnr.hasNextDouble()) {
        double d = scnr.nextDouble();
        //your code to handle `double` case
    }
    

    仅供参考,您也可以将所有内容保留为double。它将同时处理ints 和doubles 并且将在没有任何错误的情况下执行。

    【讨论】:

    • 谢谢。这为我解决了。我只需要查看它是 int 还是 double。
    【解决方案3】:

    一个数组只能定义一种类型,你可以在那里定义double,比如double [] personsWeight = new double[NUM_VALS];,当你输入一个int类型,比如236,它会被当作double接受到数组中,也输出为double

    【讨论】:

    • 如果有充分的理由,您可以将数组中的多个类型设为Object[](或在本例中为Number[]),并且元素可以可以是DoubleInteger(原始类型的盒装 版本)。在这里,当然,没有理由这样做。但是在一个数组中拥有多种类型的能力在其他情况下可能很有用。
    【解决方案4】:

    如果您有一个代表同一种值(例如体重、金额、考试分数等)的数字列表,请选择一种适合您要处理的所有值的类型。对于权重,假设您要处理非整数,请选择浮点类型(即double)。为了钱,你可以选择BigDecimal;对于考试成绩,您可以选择int,除非您希望有人可能会因为某事被扣半分,否则您会选择double。关键是,几乎从不有理由为同一种值保留不同的数字类型。

    几乎从不有理由关心输入的格式——即你真的关心输入中的权重是否有小数点吗?不,您只关心价值本身。这让一些较新的程序员感到困惑——他们将数字的值与其作为字符串的表示等同起来。但几乎总是,只有价值很重要。数字 236、236.0、236.00000、2.36e2 和 0xec 之间没有区别——值相同,表示无关紧要。 [是的,我知道如果您在 Java 程序中使用这些不同的形式,有些会被视为int,有些会被视为double,这可能会有所不同。但是这里的数字是在输入文件中,而不是在代码中。]

    所以只需将权重设为double,不要担心整数。

     double[] personsWeight = new double[NUM_VALS];
    
     int i = 0;
    
     for (i = 0; i < NUM_VALS; ++i) {
         System.out.print("Enter weight " + (i + 1) + ": ");
         System.out.println();
         personsWeight[i] = scnr.nextDouble();
     }
    

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      相关资源
      最近更新 更多