Ввод пользователя лучше проверить при помощи регулярного выражения (с учётом десятичного разделителя) как строку (это в частности позволит отфильтровать числа с множеством нулей после десятичного знака):
public static boolean isNumberBetween1And3(String num) {
return null != num && num.matches("[1-2](\\.\\d?)?|3(\\.0?)?");
}
Вариант для проверки введённого числа на принадлежность набору дискретных значений -- при помощи Set<Double>
:
private static final Set<Double> NUMS = IntStream.rangeClosed(10, 30)
.mapToObj(i -> i / 10d)
.collect(Collectors.toSet());
public static boolean isNumberBetween1And3(double num) {
return NUMS.contains(num);
}
Однако, при проверке вычисленных значений с плавающей точкой могут быть несовпадения из-за ошибок округления: 1.1 + 0.1d -> 1.2000000000000002
.
Тест обоих методов:
Scanner sc = new Scanner(System.in);
System.out.println("Введите числа: ");
while (sc.hasNextDouble()) {
String num = sc.next();
System.out.println("Input: " + num + " -> " + isNumberBetween1And3(num));
}
sc.nextLine(); // обработать неправильный ввод
System.out.println("\n----\nВведите числа: ");
while (sc.hasNextDouble()) {
double x = sc.nextDouble();
System.out.println("Input: " + x + " -> " + isNumberBetween1And3(x));
}
Результаты:
Введите числа:
1 Input: 1 -> true
1.1 Input: 1.1 -> true
1.10 Input: 1.10 -> false
1.03 Input: 1.03 -> false
2 Input: 2 -> true
2.345 Input: 2.345 -> false
2.8 Input: 2.8 -> true
3 Input: 3 -> true
4 Input: 4 -> false
q
----
Введите числа:
1 Input: 1.0 -> true
1.1 Input: 1.1 -> true
1.10 Input: 1.1 -> true
1.03 Input: 1.03 -> false
2 Input: 2.0 -> true
2.345 Input: 2.345 -> false
2.8 Input: 2.8 -> true
3 Input: 3.0 -> true
4 Input: 4.0 -> false
q