Введение
В этом лабораторном занятии (LabEx) вы научитесь проверять, является ли число числом с плавающей точкой (float) в Java. Мы рассмотрим различные методы, начиная с проверки, является ли объект экземпляром класса Float.
Затем вы узнаете, как преобразовать строку в число с плавающей точкой (float), и, наконец, как сравнивать значения с плавающей точкой (float) с значениями двойной точности (double), поняв нюансы и возможные подводные камни, связанные с этими операциями.
Проверка экземпляра класса Float
На этом этапе мы рассмотрим класс Float в Java и узнаем, как создавать и проверять экземпляры этого класса. В Java примитивные типы данных, такие как float, имеют соответствующие классы-обертки, например, Float. Эти классы-обертки предоставляют полезные методы для работы с примитивными типами.
Сначала создадим новый Java-файл с именем
FloatExample.javaв директории~/project. Для этого можно щелкнуть правой кнопкой мыши в проводнике файлов слева и выбрать "New File", а затем ввестиFloatExample.java.Откройте файл
FloatExample.javaв редакторе и добавьте следующий код:public class FloatExample { public static void main(String[] args) { // Create a primitive float variable float primitiveFloat = 123.45f; // Create a Float object using the constructor Float objectFloat = new Float(primitiveFloat); // Verify if objectFloat is an instance of the Float class boolean isFloatInstance = objectFloat instanceof Float; // Print the result System.out.println("Is objectFloat an instance of Float? " + isFloatInstance); } }Разберем новые части этого кода:
float primitiveFloat = 123.45f;: Эта строка объявляет примитивную переменную типаfloatи присваивает ей значение. Символfв конце важен, чтобы указать, что это литерал типа float.Float objectFloat = new Float(primitiveFloat);: Эта строка создает объект классаFloatс использованием конструктора классаFloatи примитивного значения типаfloat.boolean isFloatInstance = objectFloat instanceof Float;: Операторinstanceofиспользуется для проверки, является ли объект экземпляром определенного класса. Здесь мы проверяем, является лиobjectFloatэкземпляром классаFloat. Результат сохраняется в булевой переменнойisFloatInstance.System.out.println("Is objectFloat an instance of Float? " + isFloatInstance);: Эта строка выводит результат проверки в консоль.
Сохраните файл
FloatExample.java(Ctrl+S или Cmd+S).Теперь скомпилируем программу. Откройте терминал внизу WebIDE и убедитесь, что вы находитесь в директории
~/project. Затем выполните следующую команду:javac FloatExample.javaЕсли компиляция прошла успешно, вы не должны увидеть никакого вывода, и в директории
~/projectбудет создан файлFloatExample.class.Наконец, запустите скомпилированную программу с помощью команды
java:java FloatExampleВы должны увидеть следующий вывод:
Is objectFloat an instance of Float? trueЭтот вывод подтверждает, что созданный нами объект
objectFloatдействительно является экземпляром классаFloat. Понимание различий между примитивными типами и их классами-обертками имеет важное значение в Java.
Преобразование строки в тип float
На этом этапе мы научимся преобразовывать строковое представление числа в значение типа float в Java. Это распространенная задача, когда числовой ввод получается в виде текста, например, от пользователя или при чтении из файла. Класс-обертка Float предоставляет удобный метод для такого преобразования.
Откройте снова файл
FloatExample.javaв редакторе.Замените существующий код следующим новым кодом:
public class FloatExample { public static void main(String[] args) { // Define a string containing a float value String floatString = "987.65"; // Parse the string to a float primitive float parsedFloatPrimitive = Float.parseFloat(floatString); // Parse the string to a Float object Float parsedFloatObject = Float.valueOf(floatString); // Print the results System.out.println("Parsed primitive float: " + parsedFloatPrimitive); System.out.println("Parsed Float object: " + parsedFloatObject); } }Рассмотрим новые части кода:
String floatString = "987.65";: Мы определяем переменную типаString, которая содержит текстовое представление числа с плавающей точкой.float parsedFloatPrimitive = Float.parseFloat(floatString);: МетодFloat.parseFloat()- это статический метод классаFloat, который принимает строку в качестве входных данных и возвращает примитивное значение типаfloat.Float parsedFloatObject = Float.valueOf(floatString);: МетодFloat.valueOf()- это еще один статический метод, который также принимает строку и возвращает объект типаFloat. Оба метода выполняют преобразование, но один возвращает примитив, а другой - объект.
Сохраните файл
FloatExample.java(Ctrl+S или Cmd+S).Скомпилируйте модифицированную программу в терминале:
javac FloatExample.javaОпять же, если компиляция прошла успешно, не будет никакого вывода.
Запустите скомпилированную программу:
java FloatExampleВы должны увидеть следующий вывод:
Parsed primitive float: 987.65 Parsed Float object: 987.65Это показывает, как можно успешно преобразовать строку, содержащую допустимое число с плавающей точкой, как в примитивный тип
float, так и в объект типаFloatс использованием методов классаFloat.Примечание: Если строка не содержит допустимое число с плавающей точкой, эти методы вызовут исключение
NumberFormatException. В реальных приложениях важно обрабатывать такие исключения, но в этом простом примере мы предполагаем, что входная строка является допустимой.
Сравнение значений типа float и double
На этом этапе мы рассмотрим, как сравнивать значения типов float и double в Java. И float, и double используются для представления чисел с плавающей точкой, но double обеспечивает большую точность, чем float. Сравнение чисел с плавающей точкой может быть сложным из-за возможных различий в точности.
Откройте файл
FloatExample.javaв редакторе в последний раз.Замените существующий код следующим кодом, который демонстрирует сравнение значений
floatиdouble:public class FloatExample { public static void main(String[] args) { // Define a float value float floatValue = 0.1f; // Define a double value double doubleValue = 0.1; // Compare using the equality operator (==) boolean areEqualUsingEquals = (floatValue == doubleValue); // Compare using the compareTo method (for Float objects) // First, convert primitive float to Float object Float floatObject = floatValue; // Convert primitive double to Double object (for comparison with Float object) Double doubleObject = doubleValue; // Note: Direct compareTo between Float and Double objects is not standard. // We usually compare their primitive values or convert one to the other type. // Let's compare the primitive values after casting the double to float. boolean areEqualUsingCast = (floatValue == (float) doubleValue); // Print the results System.out.println("Float value: " + floatValue); System.out.println("Double value: " + doubleValue); System.out.println("Are they equal using ==? " + areEqualUsingEquals); System.out.println("Are they equal after casting double to float? " + areEqualUsingCast); // A safer way to compare floating-point numbers is to check if the absolute difference is within a small tolerance. double tolerance = 0.000001; // Define a small tolerance boolean areEqualWithTolerance = Math.abs(floatValue - doubleValue) < tolerance; System.out.println("Are they equal within tolerance? " + areEqualWithTolerance); } }Рассмотрим новый код:
float floatValue = 0.1f;: Мы определяем переменную типаfloatсо значением 0.1.double doubleValue = 0.1;: Мы определяем переменную типаdoubleсо значением 0.1.boolean areEqualUsingEquals = (floatValue == doubleValue);: Мы используем оператор равенства==для прямого сравнения значенийfloatиdouble.boolean areEqualUsingCast = (floatValue == (float) doubleValue);: Мы преобразуемdoubleValueв типfloatперед сравнением. Это может привести к неожиданным результатам из-за потери точности.double tolerance = 0.000001;: Мы определяем небольшое значение, называемое допуском (tolerance).boolean areEqualWithTolerance = Math.abs(floatValue - doubleValue) < tolerance;: Более надежный способ сравнения чисел с плавающей точкой - проверить, меньше ли абсолютная разность между ними, чем очень маленькое число (допуск).Math.abs()вычисляет абсолютное значение.
Сохраните файл
FloatExample.java(Ctrl+S или Cmd+S).Скомпилируйте программу в терминале:
javac FloatExample.javaЗапустите скомпилированную программу:
java FloatExampleВы должны увидеть вывод, похожий на следующий:
Float value: 0.1 Double value: 0.1 Are they equal using ==? false Are they equal after casting double to float? true Are they equal within tolerance? trueОбратите внимание, что прямое сравнение
floatValueиdoubleValueс использованием==дает результатfalse. Это происходит потому, что число0.1не может быть представлено точно в двоичном формате с плавающей точкой, и представления0.1в форматахfloatиdoubleнесколько различаются. Преобразованиеdoubleвfloatперед сравнением может сделать их равными в некоторых случаях, но наиболее надежный способ сравнения чисел с плавающей точкой для практического равенства - проверить, находится ли разность между ними в пределах небольшого допуска.
Резюме
В этом практическом занятии (lab) мы научились проверять, является ли число значением типа float в Java. Мы начали с изучения класса-обертки Float и способа создания и проверки экземпляров этого класса с использованием оператора instanceof. Это включало создание примитивного значения типа float и его оборачивание в объект типа Float для демонстрации концепции классов-оберток и их связи с примитивными типами.
Затем мы перешли к преобразованию строкового представления числа в значение типа Float с использованием метода Float.parseFloat(). Этот этап показал, как обрабатывать строковые входные данные и преобразовывать их в числовые типы, что является распространенной задачей в программировании. Наконец, мы рассмотрели нюансы сравнения значений типа Float с значениями типа Double, поняли, как могут возникать различия в точности, и узнали важность использования подходящих методов сравнения или учета допуска при проверке равенства.



