Как мне прочитать ввод, который может быть целым или двойным?
Я пишу программу, в которой мне нужно взять ввод с клавиатуры. Мне нужно взять номер, но я не уверен, что это 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, который выводит сообщение об ошибке.