ZetCode

Java Float Class

Last modified: April 13, 2025

The java.lang.Float class is a wrapper for the primitive float type, providing utility methods and constants for working with floating-point values. It enables conversions between float values and String representations while also offering features for numerical comparisons and special-value checks.

As part of Java's wrapper classes, Float allows primitive types to be used as objects. This is particularly useful when storing float values in collections like ArrayList or when performing operations that require objects, such as parsing input data or interacting with frameworks that expect object types.

The Float class provides several methods for handling floating-point values. These include:

Additionally, the class defines important constants:

By leveraging these methods and constants, developers can work with float values efficiently while ensuring proper handling of special cases.

Creating Float Objects

Float objects can be created using the valueOf method or autoboxing. The valueOf method is preferred as it may reuse cached instances for commonly used values, improving performance. Autoboxing automatically converts primitive float values into Float objects when necessary, such as when storing them in collections.

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        Float f1 = Float.valueOf(3.14f);
        Float f2 = Float.valueOf("3.14");

        // Autoboxing
        Float f3 = 3.14f;

        System.out.println("f1: " + f1);
        System.out.println("f2: " + f2);
        System.out.println("f3: " + f3);

        // Converting back to primitive
        float primitive = f1;
        System.out.println("Primitive value: " + primitive);
    }
}

This example demonstrates two approaches for creating Float objects: using valueOf, which may benefit from caching, and autoboxing, which simplifies conversion from primitive types. While autoboxing offers convenience, explicit use of valueOf is preferred for better memory efficiency in certain cases.

Parsing and Converting Floats

The Float class provides methods to parse strings into float values and convert float values to strings. These operations are common when dealing with user input or displaying float values.

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {

        // String to float conversion
        String numStr = "123.456";
        float parsedFloat = Float.parseFloat(numStr);
        System.out.println("Parsed float: " + parsedFloat);
        
        // Float to String conversion
        Float f = 789.012f;
        String floatStr1 = f.toString();
        String floatStr2 = Float.toString(789.012f);
        
        System.out.println("toString(): " + floatStr1);
        System.out.println("Float.toString(): " + floatStr2);
        
        // Hexadecimal string representation
        String hexStr = Float.toHexString(123.456f);
        System.out.println("Hexadecimal: " + hexStr);
    }
}

This example shows how to convert between strings and float values. The parseFloat method converts strings to primitive float, while toString methods convert float values to strings. The toHexString method provides a hexadecimal representation.

Special Float Values

Float values can represent special cases like NaN (Not a Number) and infinity. The Float class provides methods to check for these special values and constants to represent them.

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {

        // Special float values
        float nan = Float.NaN;
        float posInf = Float.POSITIVE_INFINITY;
        float negInf = Float.NEGATIVE_INFINITY;
        
        System.out.println("NaN: " + nan);
        System.out.println("Positive Infinity: " + posInf);
        System.out.println("Negative Infinity: " + negInf);
        
        // Checking special values
        System.out.println("Is NaN? " + Float.isNaN(nan));
        System.out.println("Is Infinity? " + Float.isInfinite(posInf));
        
        // Operations with special values
        System.out.println("NaN == NaN? " + (nan == nan)); // false!
        System.out.println("Float.compare(nan, nan): " + 
                         Float.compare(nan, nan)); // 0
    }
}

This example demonstrates special float values and how to check for them. Note that NaN is not equal to itself according to == operator, but Float.compare handles this case correctly. Always use Float methods to check for special values.

Float Comparison

Comparing float values requires special care due to floating-point precision issues. Minor rounding errors can lead to unexpected results when using direct equality checks. The Float class provides methods for safe comparison and ordering of float values, but for precise financial calculations, using BigDecimal is recommended.

Best Practices for Float Comparison:

Main.java
package com.zetcode;

import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) {

        Float f1 = 1.0f / 3.0f;
        Float f2 = 0.33333334f; // Approximate 1/3
        
        // Direct comparison (not recommended)
        System.out.println("f1 == f2: " + (f1 == f2));
        
        // Using equals (considers precision)
        System.out.println("f1.equals(f2): " + f1.equals(f2));
        
        // Using compareTo
        System.out.println("f1.compareTo(f2): " + f1.compareTo(f2));
        
        // Comparing with epsilon (recommended for approximate equality)
        float epsilon = 0.000001f;
        boolean nearlyEqual = Math.abs(f1 - f2) < epsilon;
        System.out.println("Nearly equal: " + nearlyEqual);

        // Using BigDecimal for precise comparison (recommended for financial calculations)
        BigDecimal bd1 = new BigDecimal("1.0").divide(new BigDecimal("3.0"), 10, BigDecimal.ROUND_HALF_UP);
        BigDecimal bd2 = new BigDecimal("0.33333334");

        System.out.println("BigDecimal comparison: " + bd1.compareTo(bd2)); // Ensures precise ordering
    }
}

This example demonstrates different ways to compare float values and highlights the advantages of using BigDecimal for precise numerical calculations where accuracy is critical.

Float Bit Manipulation

The Float class allows conversion between float values and their bit representation. This is useful for low-level operations or when precise control over the float representation is needed.

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        float value = -123.456f;
        
        // Convert float to bits
        int bits = Float.floatToIntBits(value);
        System.out.println("Float bits: " + Integer.toBinaryString(bits));
        
        // Convert bits back to float
        float reconstructed = Float.intBitsToFloat(bits);
        System.out.println("Reconstructed: " + reconstructed);
        
        // Special cases
        System.out.println("NaN bits: " + 
            Integer.toBinaryString(Float.floatToIntBits(Float.NaN)));
        System.out.println("Infinity bits: " + 
            Integer.toBinaryString(Float.floatToIntBits(Float.POSITIVE_INFINITY)));
    }
}

This example demonstrates how to convert between float values and their bit representations. The floatToIntBits method returns the 32-bit representation, while intBitsToFloat reconstructs the float value. This is useful for understanding float internals.

Float Constants

The Float class defines several useful constants that represent important float values. These constants are helpful when working with float ranges and limits.

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {

        System.out.println("Float size in bits: " + Float.SIZE);
        System.out.println("Maximum value: " + Float.MAX_VALUE);
        System.out.println("Minimum normal value: " + Float.MIN_NORMAL);
        System.out.println("Minimum positive value: " + Float.MIN_VALUE);
        System.out.println("Exponent bias: " + Float.MAX_EXPONENT);
        System.out.println("Minimum exponent: " + Float.MIN_EXPONENT);
        
        // Checking if a value is within float range
        double largeValue = 1e50;
        System.out.println(largeValue + " is finite float? " + 
            (largeValue <= Float.MAX_VALUE && largeValue >= -Float.MAX_VALUE));
    }
}

This example shows the important constants defined in the Float class. These constants represent the limits and characteristics of the float type. They're useful for range checking and understanding float capabilities.

Float vs Double

The Float class is similar to Double but works with 32-bit floating-point values instead of 64-bit. This example compares Float and Double in terms of precision and range.

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {

        // Precision comparison
        float floatPi = (float) Math.PI;
        double doublePi = Math.PI;
        
        System.out.println("Float PI: " + floatPi);
        System.out.println("Double PI: " + doublePi);
        System.out.println("Precision loss: " + (doublePi - floatPi));
        
        // Range comparison
        System.out.println("\nFloat range: " + Float.MIN_VALUE + " to " + Float.MAX_VALUE);
        System.out.println("Double range: " + Double.MIN_VALUE + " to " + Double.MAX_VALUE);
        
        // Memory usage
        System.out.println("\nFloat size: " + Float.SIZE + " bits");
        System.out.println("Double size: " + Double.SIZE + " bits");
    }
}

This example demonstrates the differences between Float and Double. Float has less precision (about 6-7 decimal digits) and smaller range than Double but uses half the memory. Choose Float when memory is critical and precision requirements are modest.

Source

Java Float Class Documentation

In this article, we've covered all major aspects of the Java Float class with practical examples. Understanding these methods is essential for proper handling of floating-point numbers in Java applications.

Author

My name is Jan Bodnar, and I am a dedicated programmer with many years of experience in the field. I began writing programming articles in 2007 and have since authored over 1,400 articles and eight e-books. With more than eight years of teaching experience, I am committed to sharing my knowledge and helping others master programming concepts.

List all Java tutorials.