Проверка числа на принадлежность промежутку

Рейтинг: -4Ответов: 1Опубликовано: 05.05.2023

Нужно проверить число, введённое пользователем, что оно принадлежит промежутку от 1 до 3 с шагом 0.1, т.е., например, если пользователь введет 1.1, то число подходит, а если 1.05 или 1.15 -- то не подходит.
При этом желательно, чтобы была проверка и на ввод именно числа, а не слова.

Ответы

▲ 2Принят

Ввод пользователя лучше проверить при помощи регулярного выражения (с учётом десятичного разделителя) как строку (это в частности позволит отфильтровать числа с множеством нулей после десятичного знака):

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