Как мне прочитать ввод, который может быть целым или двойным?

Я пишу программу, в которой мне нужно взять ввод с клавиатуры. Мне нужно взять номер, но я не уверен, что это int или double, Вот код, который у меня есть (для этой конкретной части):

import java.io.*;
import java.util.*;

//...
Scanner input  = new Scanner(System.in); 
int choice = input.nextInt();

Я знаю, что могу получить String и делать parseInt() или же parseDouble(), но я не знаю, какой это будет.

4 ответа

Решение

Просто используйте double не важно что это. Нет заметных потерь при использовании double для целочисленных значений.

Scanner input = new Scanner(System.in); 
double choice = input.nextDouble();

Затем, если вам нужно узнать, получили ли вы двойной или нет, вы можете проверить это с помощью Math.floor:

if (choice == Math.floor(choice)) {
    int choiceInt = (int) choice);
    // treat it as an int
}

Не связывайтесь сcatchИНГNumberFormatException, не ищите строку в течение периода (который может даже быть неправильным, например, если ввод 1e-3это двойной (0.001) но не имеет периода. Просто разбери это какdoubleи двигаться дальше.

Кроме того, не забывайте, что обаnextInt()а также nextDouble() не перехватывайте символ новой строки, поэтому вам нужно перехватить его nextLine() после их использования.

Ну, целые числа также удваиваются, поэтому, если вы предполагаете, что все двойные, вы будете в порядке с вашей логикой Как это:

import java.io.*;
import java.util.*;
Scanner input  = new Scanner(System.in); 
double choice = input.nextDouble();

Это становится сложным только в том случае, если вам нужно, чтобы ввод был целым числом по любой причине. И тогда parseInt() для проверки на int будет просто в порядке.

Вы можете попробовать использовать функцию floor, чтобы проверить, является ли она двойной. Если вы не знаете, функция floor в основном обрезает любые десятичные числа. Таким образом, вы можете сравнить число с десятичной дробью и без нее. Если они одинаковы, то число может рассматриваться как целое число, в противном случае - как двойное (при условии, что вам не нужно беспокоиться о больших числах, таких как длинные).

String choice = input.nextLine();

if (Double.parseDouble(choice) == Math.floor(Double.parseDouble(choice)) {
    //choice is an int
} else {
    //choice is a double
}

Что бы я сделал, это получить String и проанализируйте его как двойное или целое число.

String str = input.next();
int i = 0;
double d = 0d;
boolean isInt = false, isDouble = false;

try {
    // If the below method call doesn't throw an exception, we know that it's a valid integer
    i = Integer.parseInt(str);
    isInt = true
}catch(NumberFormatException e){
    try {
        // It wasn't in the right format for an integer, so let's try parsing it as a double
        d = Double.parseDouble(str);
        isDouble = true;
    }catch(NumberFormatException e){
        // An error was thrown when parsing it as a double, so it's neither an int or double
        System.out.println(str + " is neither an int or a double");
    }
}

// isInt and isDouble now store whether or not the input was an int or a double
// Both will be false if it wasn't a valid int or double

Таким образом, вы можете гарантировать, что вы не потеряете целочисленную точность, просто проанализировав double (значения типа double имеют другой диапазон возможных значений, чем целые числа), и вы можете обрабатывать случаи, когда ни действительное целое число, ни double не были введены.

Если исключение выдается кодом внутри try блок, код в блоке catch выполняется. В нашем случае, если исключение выдается parseInt() метод, мы выполняем код в блоке catch, где находится второй блок try. Если исключение брошено parseDouble() метод, затем мы выполняем код внутри второго блока catch, который выводит сообщение об ошибке.

Другие вопросы по тегам