为什么用户输入替身不接受与常规替身相同的参数?

How come user input doubles do not accept the same parameters as a regular double?

我目前是 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

nextDouble 尊重您的区域设置(即使用哪个字符作为小数点分隔符)并默认为 Locale.getDefault. But you can tell the Scanner which Locale to use via useLocale.

既然你要找的是英文小数,你可以在读取输入之前设置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();
}

听起来像是区域设置问题。扫描仪的区域设置将定义小数点分隔符。例如,如果您想将小数点分隔符更改为 . ,请将区域设置更改为使用句点作为小数点分隔符的国家/地区。

例如:

scanner.useLocale(Locale.CANADA);