Функция для вычисления с десятичными знаками - PullRequest
3 голосов
/ 17 августа 2010

Этот код работает нормально, когда вы, например, набираете 22 и 56, он показывает правильный результат

  import java.util.Scanner;

class apples{
    public static void main(String args[]){
    Scanner villy = new Scanner (System.in);
    double fnum, snum, answer;
    System.out.println("Enter first num: ");
    fnum = villy.nextDouble();
    System.out.println("Enter second num: ");
    snum = villy.nextDouble();
    answer = fnum + snum;
    System.out.println(answer);
    }
}

, но когда вы пытаетесь ввести десятичные числа, например 23.53 и 42.76, он завершается неудачей со следующим исключением

Exception in thread "main": java.util.InputMismatchException
       at java.util.Scanner.throwFor(unknown Source)
       at java.util.Scanner.next(unknown Source)
       at java.util.Scanner.nextDouble(unknown Source)
       at apples.main(apples.java:8)

Ответы [ 4 ]

1 голос
/ 17 августа 2010

Вероятно, вы вводили запятую вместо точки при вводе чисел. Это вызовет исключение InputMismatchException. Я запустил код, и он отлично работает с правильно введенным вводом, но выдает исключение InputMismatchException при замене точки любым другим символом.

1 голос
/ 17 августа 2010

Посмотрите описание API вашего исключения.

Класс InputMismatchException :

Брошенный сканером, чтобы указать, что полученный токен не соответствует шаблону для ожидаемого типа, или что токен находится вне диапазона для ожидаемого типа

Скорее всего, вы не вводите ожидаемые данные; во всяком случае, «следующий» элемент сканера в какой-то момент не является двойным.

Глядя на скриншот, вы, похоже, правильно используете API. Я подозреваю, что поддержка встроенной консоли Eclipse делает не совсем то, что ожидает сканер. Попробуйте изменить первую строку вашего метода на:

Scanner villy = new Scanner("23.53\n42.76\n");

Это должно быть функционально идентично тому, что вы получите из входного потока; если это работает, значит, проблема в вводе Eclipse.

Одна из попыток, которая в целом всегда является хорошей идеей, заключается в явном указании кодировки входного потока. Вы хотите отправить символов , но на самом деле вы отправляете байтов . Если Eclipse использует какую-то необычную кодировку символов, а сканер угадывает другую по умолчанию, вы столкнетесь с проблемами. Указание фактической кодировки в конструкторе сканера исключит эту возможность.

Другой вариант заключается в том, что языковой стандарт, с которым работает Java, фактически использует запятую в качестве десятичного разделителя. Если это так, то Сканер прав, вы не указали двойное значение правильно (хотя это также должно произойти с ошибкой в ​​примере на основе строк).

1 голос
/ 17 августа 2010

Вы случайно не на английском языке?Например, для французской или немецкой локали вам нужно ввести 23,53, а не 23.53.

По умолчанию для сканера используется локаль, которую возвращает Locale.getDefault (): на английском компьютере онадолжен вернуть Locale.ENGLISH.Вы можете установить английскую локаль, выполнив это:

Scanner villy = new Scanner(System.in).useLocale(Locale.ENGLISH);
0 голосов
/ 17 августа 2010

Следующий фрагмент кода работает нормально. Ваша проблема должна лежать в другом месте. Что вы имеете в виду под "это не удается"? Выдает ли это сообщение об ошибке или исключение?

double fnum=0, snum=0, answer = 0;
fnum=23.53;
snum=42.76;
answer=fnum+snum;
System.out.println("answer="+answer); //prints 66.28999999999999
...