如何在数组中接受并输出双精度和双精度数?

如何在数组中接受并输出双精度和双精度数?

问题描述:

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。

有无论如何,我可以让阵列接受这两种类型的数字在扫描仪或我不得不采取另一种方式,它的工作?

+2

正常情况下,将所有内容视为“双”。你可以在没有问题的情况下将236存储在“double”中。为什么重要的是你把它作为一个整数?会有什么不必要的后果将其保持为双重? – ajb

+0

另外,InputMismatchException发生在这一行:'personsWeight [i] = scnr.nextInt();'并且与数组类型无关。它与使用'nextInt()'的输入有关,它有一个小数。 –

您可以使用hasNextInt()hasNextDouble()方法Scanner类来初始确定输入的数字是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。它将处理int s和double s,并将执行时不会出现任何错误。

+0

谢谢。这为我解决了它。简单地看,如果它是一个int或双是我需要的。 – AssassinsHonor

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

阵列可以定义仅一种类型的,则可以定义double那里,像double [] personsWeight = new double[NUM_VALS];当你输入一个int类型,像236,它将被接受作为double成阵列,输出作为double太。

+0

如果有一个很好的理由,你可以在数组中使用'Object []'(或者在这种情况下是'Number []')来创建多个类型,并且这些元素可以是'Double'或'Integer'(原始类型的_boxed_版本)。当然,这里没有理由。但是在一个数组中有多个类型的能力在其他情况下可能很有用。 – ajb

当你有一个数字列表,所有这些数字都代表相同类型的值(例如重量,金额,测试分数等)时,选择一种适合所有你想处理的值的类型。对于重量,假设你想处理非整数,选择一个浮点类型(即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(); 
}