The Double class is the wrapper class for Java's primitive double type. It represents floating-point numbers and provides useful methods for conversion, comparison, parsing, formatting, and inspecting special numeric values.
You will commonly encounter Double when working with measurements, percentages, scientific calculations, prices, statistical values, configuration data, and APIs that require objects instead of primitive values.
Why Do We Need Double?
The primitive double is designed for floating-point calculations. However, Java Collections and generic APIs work with reference types, so a floating-point value sometimes needs an object representation.
List<Double> temperatures = new ArrayList<>(); temperatures.add(28.5); temperatures.add(31.2); temperatures.add(29.8);
The values written in the add() calls are primitive double values. Java automatically wraps them as Double objects through autoboxing.
Size and Important Constants
A Java double uses 64 bits. Unlike an integer type, its range and precision are described in terms of floating-point representation rather than a simple minimum and maximum integer.
System.out.println(Double.SIZE); System.out.println(Double.BYTES); System.out.println(Double.MAX_VALUE); System.out.println(Double.MIN_VALUE);
| Constant | Meaning |
|---|---|
| SIZE | Number of bits used by double. |
| BYTES | Number of bytes used by double. |
| MAX_VALUE | Largest positive finite double value. |
| MIN_VALUE | Smallest positive non-zero double value. |
| POSITIVE_INFINITY | Positive infinity. |
| NEGATIVE_INFINITY | Negative infinity. |
| NaN | Represents Not-a-Number. |
Creating Double Objects
Modern Java code should use autoboxing or Double.valueOf() instead of the deprecated wrapper constructor.
Double first = 45.75; Double second = Double.valueOf(89.25); System.out.println(first); System.out.println(second);
The first statement uses autoboxing, while the second explicitly obtains a Double object through valueOf().
Converting Double to double
The doubleValue() method extracts the primitive double represented by a Double object.
Double price = 149.99; double value = price.doubleValue(); System.out.println(value);
In most modern Java code, explicit unboxing is unnecessary because Java can perform it automatically.
Double price = 149.99; double value = price;
Parsing a String into a Double
Applications often receive decimal numbers as text. For example, a value might arrive from a configuration file, form field, CSV file, or external API. Double.parseDouble() converts that text into a primitive double.
String text = "45.75"; double amount = Double.parseDouble(text); System.out.println(amount);
If the supplied text cannot be interpreted as a valid floating-point number, the method throws NumberFormatException.
Double.valueOf() Versus Double.parseDouble()
Both methods can convert a numeric string, but they differ in their return types.
| Method | Input | Return Type |
|---|---|---|
| Double.parseDouble() | String | double |
| Double.valueOf() | String | Double |
double primitiveValue = Double.parseDouble("99.95");
Double wrapperValue = Double.valueOf("99.95");Use parseDouble() when you need a primitive double. Use valueOf() when an object representation is required.
Comparing Double Values
Floating-point comparison deserves extra care. Values that look mathematically identical may not always have exactly the same binary representation.
double first = 0.1 + 0.2; double second = 0.3; System.out.println(first); System.out.println(second); System.out.println(first == second);
The result of the equality comparison may be surprising because many decimal fractions cannot be represented exactly using binary floating-point arithmetic.
Comparing Double Objects
The Double class provides compare() and compareTo() for ordering values.
Double first = 25.5; Double second = 30.5; System.out.println(Double.compare(first, second)); System.out.println(first.compareTo(second));
Both comparison methods indicate ordering: a negative result means the first value is smaller, zero means the values compare equally, and a positive result means the first value is greater.
Checking for NaN
NaN means Not-a-Number. It can appear as the result of certain invalid floating-point operations.
double result = 0.0 / 0.0; System.out.println(result); System.out.println(Double.isNaN(result));
Use Double.isNaN() when you need to determine whether a floating-point result represents NaN.
Checking for Infinity
Floating-point calculations can also produce positive or negative infinity.
double positive = 1.0 / 0.0; double negative = -1.0 / 0.0; System.out.println(Double.isInfinite(positive)); System.out.println(Double.isInfinite(negative));
The Double.isInfinite() method lets you detect whether a value represents either positive or negative infinity.
Useful Double Methods
| Method | Purpose |
|---|---|
| parseDouble() | Converts a String into a primitive double. |
| valueOf() | Creates or obtains a Double representation of a value. |
| doubleValue() | Returns the wrapped value as a double. |
| compare() | Compares two double values. |
| compareTo() | Compares one Double object with another. |
| isNaN() | Checks whether a value is NaN. |
| isInfinite() | Checks whether a value is infinite. |
| toString() | Converts a double value into its String representation. |
| sum() | Returns the sum of two double values. |
| max() | Returns the greater of two double values. |
| min() | Returns the smaller of two double values. |
Converting Double to String
The Double.toString() method converts a floating-point value into its textual representation.
double temperature = 36.75;
String text = Double.toString(temperature);
System.out.println("Temperature: " + text);Using Double for Mathematical Operations
double a = 15.5; double b = 8.25; System.out.println(Double.sum(a, b)); System.out.println(Double.max(a, b)); System.out.println(Double.min(a, b));
These methods can make simple operations more expressive, particularly when working with method references, generic code, or APIs that expect the corresponding wrapper functionality.
Double and Null Values
Because Double is an object type, a Double reference can contain null.
Double measurement = null; System.out.println(measurement);
However, attempting to unbox the null reference into a primitive double causes a NullPointerException.
Double measurement = null; double value = measurement;
A Real-World Example
Suppose an application receives a temperature as text from an external source. The program can parse it into a primitive value and then perform calculations.
String input = "27.6";
double temperature = Double.parseDouble(input);
double fahrenheit = (temperature * 9.0 / 5.0) + 32.0;
System.out.println("Celsius: " + temperature);
System.out.println("Fahrenheit: " + fahrenheit);The important idea is that external data often starts as text. The Double class provides the conversion tools needed to bring that data into numeric calculations.
Best Practices
- Use double for general floating-point calculations when its precision model is appropriate.
- Use Double when an object, generic type, or nullable value is required.
- Use Double.parseDouble() when converting text into a primitive double.
- Use Double.valueOf() when an object representation is required.
- Be cautious when comparing floating-point values for exact equality.
- Use Double.isNaN() and Double.isInfinite() when special floating-point results need to be detected.
- Consider BigDecimal for applications that require exact decimal arithmetic.
- Check for null before unboxing a Double reference.
Interview Insight
A common interview question is: “Why can 0.1 + 0.2 produce a result that is not exactly 0.3?” The reason is that many decimal fractions cannot be represented exactly in binary floating-point format. This is a property of floating-point representation rather than a simple Java arithmetic bug.
Double Class at a Glance
| Feature | Key Point |
|---|---|
| Wrapper type | Double wraps the primitive double. |
| Size | 64 bits or 8 bytes. |
| Parsing | parseDouble() converts text to primitive double. |
| Object conversion | valueOf() provides a Double object. |
| Comparison | compare() and compareTo() support ordering. |
| Special values | Supports NaN and positive or negative infinity. |
| Precision | Floating-point values can have representation and rounding limitations. |
| Null | A Double reference can be null. |
The Double class connects Java's floating-point primitive with its object-oriented ecosystem. Its parsing, comparison, conversion, and special-value methods make it especially useful when numeric data crosses the boundary between text, objects, and calculations. Understanding floating-point behavior is just as important as knowing the methods, because good Java code must account for precision and special values rather than treating every decimal number as perfectly exact.
