Введение
В этом лабораторном занятии (LabEx) вы научитесь определять, является ли число целым в Java. Мы рассмотрим различные методы, начиная с метода Math.floor() для проверки на целочисленные значения. Вы будете практиковаться с типами данных double и float, чтобы понять, как этот метод работает с разными представлениями чисел с плавающей запятой. В конце мы рассмотрим, как обрабатывать строковые входные данные и преобразовывать их в числовые типы перед выполнением проверки на целое число. Это лабораторное занятие предоставит вам практические навыки для валидации числовых данных в ваших Java-программах.
Использование Math.floor() для проверки на целое число
В этом шаге мы рассмотрим, как определить, является ли число целым в Java с использованием метода Math.floor(). Это распространенная задача в программировании, особенно при работе с пользовательским вводом или вычислениями.
Сначала разберемся, что делает метод Math.floor(). Метод Math.floor() в Java возвращает наибольшее целое число, которое меньше или равно аргументу. Например, Math.floor(5.9) вернет 5.0, а Math.floor(5.0) вернет 5.0.
Мы можем использовать это свойство для проверки, является ли число целым. Если число является целым, применение к нему метода Math.floor() даст то же самое число. Если число имеет дробную часть, метод Math.floor() вернет меньшее целое число.
Создадим новый Java-файл, чтобы потренироваться в использовании этого метода. Откройте WebIDE и создайте новый файл с именем IntegerCheck.java в директории ~/project.
Теперь скопируйте и вставьте следующий код в файл IntegerCheck.java:
public class IntegerCheck {
public static void main(String[] args) {
double number1 = 10.0;
double number2 = 10.5;
// Check if number1 is an integer
if (number1 == Math.floor(number1)) {
System.out.println(number1 + " is an integer.");
} else {
System.out.println(number1 + " is not an integer.");
}
// Check if number2 is an integer
if (number2 == Math.floor(number2)) {
System.out.println(number2 + " is an integer.");
} else {
System.out.println(number2 + " is not an integer.");
}
}
}
Разберем код по частям:
double number1 = 10.0;иdouble number2 = 10.5;: Мы объявляем две переменные типаdouble, одна из которых представляет целое число, а другая - нецелое число.if (number1 == Math.floor(number1)): Это основная логика. Мы сравниваем исходное число (number1) с результатом вызова методаMath.floor(number1). Если они равны, то число является целым.System.out.println(...): Эти строки выводят результат на консоль.
Сохраните файл IntegerCheck.java.
Теперь скомпилируем и запустим программу. Откройте терминал в WebIDE и убедитесь, что вы находитесь в директории ~/project.
Скомпилируйте код с помощью команды javac:
javac IntegerCheck.java
Если компиляция прошла успешно, в директории ~/project должен появиться новый файл с именем IntegerCheck.class.
Теперь запустите скомпилированный код с помощью команды java:
java IntegerCheck
Вы должны увидеть следующий вывод:
10.0 is an integer.
10.5 is not an integer.
Этот вывод подтверждает, что наша логика с использованием метода Math.floor() правильно определяет, представляет ли значение типа double целое число.
Тестирование с типами double и float
В предыдущем шаге мы использовали метод Math.floor() с значениями типа double. В Java есть разные типы данных для представления чисел, в том числе double и float. Оба типа используются для чисел с плавающей запятой (чисел с десятичной точкой), но double обеспечивает большую точность, чем float.
Давайте модифицируем нашу программу IntegerCheck.java, чтобы протестировать работу метода Math.floor() с обоими типами: double и float.
Откройте файл IntegerCheck.java в редакторе WebIDE.
Замените существующий код следующим:
public class IntegerCheck {
public static void main(String[] args) {
double doubleNumber1 = 20.0;
double doubleNumber2 = 20.75;
float floatNumber1 = 30.0f; // Note the 'f' suffix for float literals
float floatNumber2 = 30.25f;
// Check if doubleNumber1 is an integer
if (doubleNumber1 == Math.floor(doubleNumber1)) {
System.out.println(doubleNumber1 + " (double) is an integer.");
} else {
System.out.println(doubleNumber1 + " (double) is not an integer.");
}
// Check if doubleNumber2 is an integer
if (doubleNumber2 == Math.floor(doubleNumber2)) {
System.out.println(doubleNumber2 + " (double) is an integer.");
} else {
System.out.println(doubleNumber2 + " (double) is not an integer.");
}
// Check if floatNumber1 is an integer
// Math.floor() takes a double, so the float is promoted to double
if (floatNumber1 == Math.floor(floatNumber1)) {
System.out.println(floatNumber1 + " (float) is an integer.");
} else {
System.out.println(floatNumber1 + " (float) is not an integer.");
}
// Check if floatNumber2 is an integer
if (floatNumber2 == Math.floor(floatNumber2)) {
System.out.println(floatNumber2 + " (float) is an integer.");
} else {
System.out.println(floatNumber2 + " (float) is not an integer.");
}
}
}
Обратите внимание на суффикс f после литералов типа float (30.0f, 30.25f). В Java это необходимо, чтобы указать, что число имеет тип float, а не double (по умолчанию литералы с плавающей запятой имеют тип double).
Также обратите внимание, что метод Math.floor() определен для приема аргумента типа double. Когда вы передаете значение типа float в метод Math.floor(), Java автоматически преобразует float в double перед выполнением метода. Сравнение floatNumber1 == Math.floor(floatNumber1) все равно работает, потому что результат метода Math.floor() (тип double) сравнивается с floatNumber1 (который также преобразуется в double для сравнения).
Сохраните файл IntegerCheck.java.
Теперь скомпилируйте и запустите модифицированную программу из терминала в директории ~/project:
javac IntegerCheck.java
java IntegerCheck
Вы должны увидеть вывод, похожий на следующий:
20.0 (double) is an integer.
20.75 (double) is not an integer.
30.0 (float) is an integer.
30.25 (float) is not an integer.
Это показывает, что наш метод сравнения с использованием Math.floor() работает корректно как для типа double, так и для типа float.
Обработка преобразования строкового ввода
В реальных приложениях часто требуется получать ввод от пользователя, и обычно этот ввод считывается как String. Чтобы выполнить числовые проверки, например, определить, представляет ли ввод целое число, сначала нужно преобразовать String в числовой тип, например, double.
В этом шаге мы модифицируем нашу программу, чтобы она принимала ввод пользователя в виде String, преобразовывала его в double, а затем использовала Math.floor() для проверки, представляет ли исходный ввод целое число.
Откройте файл IntegerCheck.java в редакторе WebIDE.
Замените существующий код следующим:
import java.util.Scanner; // Import the Scanner class
public class IntegerCheck {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // Create a Scanner object
System.out.print("Enter a number: "); // Prompt the user for input
String input = scanner.nextLine(); // Read user input as a String
try {
// Convert the String input to a double
double number = Double.parseDouble(input);
// Check if the number is an integer using Math.floor()
if (number == Math.floor(number)) {
System.out.println("The input '" + input + "' represents an integer.");
} else {
System.out.println("The input '" + input + "' does not represent an integer.");
}
} catch (NumberFormatException e) {
// Handle cases where the input is not a valid number
System.out.println("Invalid input: '" + input + "' is not a valid number.");
} finally {
scanner.close(); // Close the scanner
}
}
}
Рассмотрим новые части кода:
import java.util.Scanner;: Эта строка импортирует классScanner, который используется для чтения ввода с консоли.Scanner scanner = new Scanner(System.in);: Это создает объектScanner, который читает ввод из стандартного потока ввода (System.in), который обычно представляет клавиатуру.System.out.print("Enter a number: ");: Эта строка приглашает пользователя ввести число.String input = scanner.nextLine();: Эта строка считывает всю введенную пользователем строку ввода какStringи сохраняет ее в переменнойinput.try { ... } catch (NumberFormatException e) { ... }: Это блокtry-catch. Он используется для обработки потенциальных ошибок. В данном случае мы пытаемся преобразовать строковый ввод вdouble. Если ввод не является допустимым числом (например, "hello"), возникнет исключениеNumberFormatException, и код внутри блокаcatchбудет выполнен.double number = Double.parseDouble(input);: Это важная часть преобразования.Double.parseDouble()- это статический метод классаDouble, который пытается преобразоватьStringв значение типаdouble.finally { scanner.close(); }: Блокfinallyгарантирует, что методscanner.close()будет вызван, освобождая системные ресурсы, используемые объектомScanner, независимо от того, произошло исключение или нет.
Сохраните файл IntegerCheck.java.
Теперь скомпилируйте и запустите программу из терминала в директории ~/project:
javac IntegerCheck.java
java IntegerCheck
Теперь программа будет ждать, пока вы введете данные.
Попробуйте ввести целое число, например, 42, и нажмите Enter. Вывод должен быть таким:
Enter a number: 42
The input '42' represents an integer.
Запустите программу еще раз и введите нецелое число, например, 3.14, и нажмите Enter. Вывод должен быть таким:
Enter a number: 3.14
The input '3.14' does not represent an integer.
Запустите программу еще раз и введите что-то, что не является числом, например, test, и нажмите Enter. Вывод должен быть таким:
Enter a number: test
Invalid input: 'test' is not a valid number.
Это демонстрирует, как обработать ввод пользователя в виде String, преобразовать его в числовой тип, применить нашу проверку с использованием Math.floor() и при этом обработать потенциальные ошибки из-за некорректного ввода.
Резюме
В этом практическом занятии (лабораторной работе) мы научились проверять, является ли число целым в Java с использованием метода Math.floor(). Мы изучили концепцию, согласно которой для целого числа метод Math.floor() возвращает то же самое значение, а для нецелого числа - меньшее целое число. Мы реализовали эту логику в программе на Java, сравнивая исходное число с результатом работы метода Math.floor() для определения, является ли оно целым.



