Como Verificar se um Número é um Float em Java

JavaBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se um número é um float em Java. Exploraremos diferentes técnicas, começando por verificar se um objeto é uma instância da classe Float.

Em seguida, você aprenderá como converter uma string em um float e, finalmente, como comparar valores float com valores double, compreendendo as nuances e as potenciais armadilhas envolvidas nessas operações.

Verificar Instância da Classe Float

Nesta etapa, exploraremos a classe Float em Java e como criar e verificar instâncias dessa classe. Em Java, tipos de dados primitivos como float têm classes wrapper correspondentes, como Float. Essas classes wrapper fornecem métodos úteis para trabalhar com os tipos primitivos.

  1. Primeiro, vamos criar um novo arquivo Java chamado FloatExample.java no seu diretório ~/project. Você pode fazer isso clicando com o botão direito no Explorador de Arquivos à esquerda e selecionando "Novo Arquivo", depois digitando FloatExample.java.

  2. Abra o arquivo FloatExample.java no editor e adicione o seguinte código:

    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);
        }
    }
    

    Vamos detalhar as novas partes deste código:

    • float primitiveFloat = 123.45f;: Esta linha declara uma variável float primitiva e atribui um valor a ela. O f no final é importante para indicar que este é um literal float.
    • Float objectFloat = new Float(primitiveFloat);: Esta linha cria um objeto Float usando o construtor da classe Float e o valor float primitivo.
    • boolean isFloatInstance = objectFloat instanceof Float;: O operador instanceof é usado para verificar se um objeto é uma instância de uma classe específica. Aqui, verificamos se objectFloat é uma instância da classe Float. O resultado é armazenado em uma variável booleana isFloatInstance.
    • System.out.println("Is objectFloat an instance of Float? " + isFloatInstance);: Esta linha imprime o resultado da verificação no console.
  3. Salve o arquivo FloatExample.java (Ctrl+S ou Cmd+S).

  4. Agora, vamos compilar o programa. Abra o Terminal na parte inferior da WebIDE e certifique-se de que você está no diretório ~/project. Em seguida, execute o seguinte comando:

    javac FloatExample.java
    

    Se a compilação for bem-sucedida, você não deverá ver nenhuma saída, e um arquivo FloatExample.class será criado no diretório ~/project.

  5. Finalmente, execute o programa compilado usando o comando java:

    java FloatExample
    

    Você deverá ver a seguinte saída:

    Is objectFloat an instance of Float? true
    

    Esta saída confirma que o objectFloat que criamos é de fato uma instância da classe Float. Compreender a diferença entre tipos primitivos e suas classes wrapper é importante em Java.

Converter String para Float

Nesta etapa, aprenderemos como converter uma representação String de um número em um valor float em Java. Esta é uma tarefa comum quando você recebe entrada numérica como texto, por exemplo, da entrada do usuário ou da leitura de um arquivo. A classe wrapper Float fornece um método conveniente para esta conversão.

  1. Abra o arquivo FloatExample.java no editor novamente.

  2. Substitua o código existente pelo seguinte código novo:

    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);
        }
    }
    

    Vamos analisar as novas partes:

    • String floatString = "987.65";: Definimos uma variável String que contém a representação textual de um número de ponto flutuante.
    • float parsedFloatPrimitive = Float.parseFloat(floatString);: O método Float.parseFloat() é um método estático da classe Float que recebe uma String como entrada e retorna um valor float primitivo.
    • Float parsedFloatObject = Float.valueOf(floatString);: O método Float.valueOf() é outro método estático que também recebe uma String e retorna um objeto Float. Ambos os métodos realizam a conversão, mas um retorna um primitivo e o outro retorna um objeto.
  3. Salve o arquivo FloatExample.java (Ctrl+S ou Cmd+S).

  4. Compile o programa modificado no Terminal:

    javac FloatExample.java
    

    Novamente, se for bem-sucedido, não haverá saída.

  5. Execute o programa compilado:

    java FloatExample
    

    Você deverá ver a seguinte saída:

    Parsed primitive float: 987.65
    Parsed Float object: 987.65
    

    Isso demonstra como você pode converter com sucesso uma string contendo um número de ponto flutuante válido em um float primitivo e em um objeto Float usando os métodos da classe Float.

    Nota: Se a string não contiver um número de ponto flutuante válido, esses métodos lançarão uma NumberFormatException. É importante lidar com essas exceções em aplicações do mundo real, mas para este exemplo básico, assumimos que a string de entrada é válida.

Comparar Float com Double

Nesta etapa, exploraremos como comparar valores float e double em Java. Tanto float quanto double são usados para representar números de ponto flutuante, mas double oferece maior precisão do que float. Comparar números de ponto flutuante pode, às vezes, ser complicado devido a potenciais diferenças de precisão.

  1. Abra o arquivo FloatExample.java no editor pela última vez.

  2. Substitua o código existente pelo seguinte código que demonstra a comparação de float e 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);
        }
    }
    

    Vamos examinar o novo código:

    • float floatValue = 0.1f;: Definimos uma variável float com o valor 0.1.
    • double doubleValue = 0.1;: Definimos uma variável double com o valor 0.1.
    • boolean areEqualUsingEquals = (floatValue == doubleValue);: Usamos o operador de igualdade == para comparar os valores float e double diretamente.
    • boolean areEqualUsingCast = (floatValue == (float) doubleValue);: Convertemos o doubleValue para um float antes de comparar. Isso pode, às vezes, levar a resultados inesperados devido à perda de precisão.
    • double tolerance = 0.000001;: Definimos um pequeno valor chamado tolerância.
    • boolean areEqualWithTolerance = Math.abs(floatValue - doubleValue) < tolerance;: Uma maneira mais robusta de comparar números de ponto flutuante é verificar se a diferença absoluta entre eles é menor que um número muito pequeno (a tolerância). Math.abs() calcula o valor absoluto.
  3. Salve o arquivo FloatExample.java (Ctrl+S ou Cmd+S).

  4. Compile o programa no Terminal:

    javac FloatExample.java
    
  5. Execute o programa compilado:

    java FloatExample
    

    Você deverá ver uma saída semelhante a esta:

    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
    

    Observe que a comparação de floatValue e doubleValue diretamente usando == resulta em false. Isso ocorre porque 0.1 não pode ser representado exatamente em ponto flutuante binário, e as representações float e double de 0.1 são ligeiramente diferentes. Converter o double para float antes da comparação pode fazê-los parecer iguais em alguns casos, mas a maneira mais confiável de comparar números de ponto flutuante para igualdade prática é verificar se sua diferença está dentro de uma pequena tolerância.

Resumo

Neste laboratório, aprendemos como verificar se um número é um float em Java. Começamos explorando a classe wrapper Float e como criar e verificar instâncias dessa classe usando o operador instanceof. Isso envolveu a criação de um float primitivo e, em seguida, encapsulá-lo em um objeto Float para demonstrar o conceito de classes wrapper e sua relação com tipos primitivos.

Em seguida, passamos para a análise de uma representação string de um número em um Float usando o método Float.parseFloat(). Esta etapa destacou como lidar com entradas de string e convertê-las em tipos numéricos, uma tarefa comum em programação. Finalmente, examinamos as nuances da comparação de valores Float com valores Double, compreendendo o potencial de diferenças de precisão e a importância de usar métodos de comparação apropriados ou considerar uma tolerância para verificações de igualdade.