How to Separate Double into Integer and Decimal Parts

1. Overview

In this tutorial, we’ll explore various methods to separate integer and
decimal parts of floating-point types in Java, namely float
and double.

2. Issues with Floating-Points Types

Let’s start by looking at a simple fraction, and a naive way of
performing the separation, via casting:

double doubleNumber = 24.04;
int intPart = (int) doubleNumber;
System.out.println("Double Number: " + doubleNumber);
System.out.println("Integer Part: " + intPart);
System.out.println("Decimal Part: " + (doubleNumber - intPart));

When we try to run the code above, here’s what we get:

Double Number: 24.04
Integer Part: 24
Decimal Part: 0.03999999999999915

Contrary to our expectation, the output does not print the decimal part
correctly. Hence, the Floating-point numbers aren’t suitable for
calculations where roundoff errors cannot be tolerated.

3. First Approach: Splitting the String

First of all, let’s convert the decimal number to a String equivalent.
Then we can split the String at the decimal point index.

Let’s understand this with an example:

double doubleNumber = 24.04;
String doubleAsString = String.valueOf(doubleNumber);
int indexOfDecimal = doubleAsString.indexOf(".");
System.out.println("Double Number: " + doubleNumber);
System.out.println("Integer Part: " + doubleAsString.substring(0, indexOfDecimal));
System.out.println("Decimal Part: " + doubleAsString.substring(indexOfDecimal));

The output of the code above is:

Double Number: 24.04
Integer Part: 24
Decimal Part: .04

The output is exactly what we expect. But, the problem here is the
limitation of using a String – which means we won’t be able to now
perform any other arithmetic operations it.

4. Second Approach: Using BigDecimal

The
BigDecimal class
in Java provides its user with complete control over rounding behavior.
This class also provides operations for arithmetic, scale manipulation,
rounding, comparison, hashing, and format conversion.

Let’s use BigDecimal to get the integer and decimal parts of a
floating point number:

double doubleNumber = 24.04;
BigDecimal bigDecimal = new BigDecimal(String.valueOf(doubleNumber));
int intValue = bigDecimal.intValue();
System.out.println("Double Number: " + bigDecimal.toPlainString());
System.out.println("Integer Part: " + intValue);
System.out.println("Decimal Part: " + bigDecimal.subtract(
  new BigDecimal(intValue)).toPlainString());

The output will be:

Double Number: 24.04
Integer Part: 24
Decimal Part: 0.04

As we can see above, the output is as expected. We can also perform
arithmetic operations with the help of methods provided in BigDecimal
class.

5. Conclusion

In this article, we discussed various methods to separate integer and
decimal parts of floating-point types. We also discussed the benefits of
using BigDecimal for floating point calculations.

Also, our detailed tutorial on
BigDecimal and
BigInteger in Java
 discusses more characteristics and usage scenarios
of the two classes.

Finally, the complete source code for this tutorial is
available
on GitHub.

Leave a Reply

Your email address will not be published.