Почему пользовательские двойники ввода не принимают те же параметры, что и обычные двойные? - PullRequest
0 голосов
/ 01 марта 2020

Я в настоящее время начинающий, когда дело доходит до Java, и я наткнулся на то, что меня немного поразило.

Используя сканер, я попытался создать программу, которая позволяла мне сравнивать 2 числа. Как в:

num1 > num2
num2 < num1
num1 == num2

И т. Проблема заключалась в том, что всякий раз, когда я должен был вводить номер на консоль, когда меня спрашивали; если бы у номера был полный останов, это дало бы мне ошибку исключения несовпадения Я попытался преодолеть эту проблему путем реализации scanner.nextLine (); или (double) перед nextDouble (); метод. Но это не сработало. Может ли кто-нибудь помочь мне? Я попытаюсь объяснить это дальше, если мое объяснение проблемы не было достаточно хорошим, я впервые использую этот веб-сайт.

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

Ответы [ 3 ]

0 голосов
/ 01 марта 2020

nextDouble учитывает ваши настройки локали (т.е. какой символ использовать в качестве десятичного разделителя) и по умолчанию Locale.getDefault. Но вы можете указать Scanner, какой Locale использовать через useLocale.

Так как кажется, что вы ищете десятичные дроби в стиле Engli sh, вы можете установить 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();
}
0 голосов
/ 01 марта 2020

Похоже, проблема локали. Локаль сканера будет определять десятичный разделитель. Например, если вы хотите изменить десятичный разделитель на ., измените локаль на страну, в которой точки используются в качестве десятичных разделителей.

Пример:

scanner.useLocale(Locale.CANADA);
0 голосов
/ 01 марта 2020

Сделайте это следующим образом:

Scanner scanner = new Scanner(System.in);
scanner.useLocale(Locale.getDefault());
...