首页 > 解决方案 > 为什么用户输入双打不接受与常规双打相同的参数?

问题描述

我目前是 Java 的初学者,我偶然发现了一些让我有点吃惊的东西。

使用扫描仪,我尝试创建一个允许我比较 2 个数字的程序。如:

num1 > num2
num2 < num1
num1 == num2

诸如此类。

我打算使用双精度数,因为它允许各种数字,从整数到小数。问题是每当我在控制台问我时输入一个数字时;如果数字有一个句号,它会给我一个不匹配的异常错误。我尝试通过实现一个scanner.nextLine()来克服这个问题;或 nextDouble() 之前的 (double); 方法。但这没有用。有人可以帮帮我吗?如果我对问题的解释不够好,我会尝试进一步解释,这是我第一次使用这个网站。

public static void numeralComparison() {
    Scanner scanner = new Scanner(System.in);

    System.out.println("Input the first number. Use a comma to indicate decimal points: ");
    double num1 = (double) scanner.nextDouble();
    scanner.nextLine();

    System.out.println("Input the second number: ");
    double num2 = (double) scanner.nextDouble();
    scanner.nextLine();

    if(num1 < num2) {
        System.out.println(num1 + " < " + num2);
    } else if (num2 < num1) {
        System.out.println(num2 + " < " + num1);
    } else {
        System.out.println(num1 + " = " + num2);
    }

    scanner.close();

}

如果我为控制台提供了数字“30,0”,它就可以工作。它没有抛出异常。但是,例如,如果我要为它提供“30.0”,它会抛出一个 InputMismatch 异常。

JDK 规范:Corretto 11、IntelliJ IDEA

标签: javadoublejava.util.scannermismatch

解决方案


nextDouble尊重您的语言环境设置(即使用哪个字符作为小数分隔符)并默认为Locale.getDefault. 但是您可以通过 告诉使用Scanner哪个。LocaleuseLocale

由于您似乎正在寻找英式小数,因此您可以scanner.useLocale(Locale.ENGLISH)在读取输入之前设置:

public static void numeralComparison() {
    Scanner scanner = new Scanner(System.in);
    scanner.useLocale(Locale.ENGLISH);

    System.out.println("Input the first number. Use a comma to indicate decimal points: ");
    double num1 = (double) scanner.nextDouble();
    scanner.nextLine();

    System.out.println("Input the second number: ");
    double num2 = (double) scanner.nextDouble();
    scanner.nextLine();

    if (num1 < num2) {
        System.out.println(num1 + " < " + num2);
    } else if (num2 < num1) {
        System.out.println(num2 + " < " + num1);
    } else {
        System.out.println(num1 + " = " + num2);
    }

    scanner.close();
}

推荐阅读