How to Round a Number to N Decimal Places in Java

1. Overview

In this short tutorial, we’ll learn how to round a number to n decimal places in Java.

2. Decimal Numbers in Java

Java provides two primitive types that we can use for storing decimal numbers: float and doubleDouble is the default type:

double PI = 3.1415;

However, we should never use either type for precise values, such as currencies. For that, and also for rounding, we can use the BigDecimal class.

3. Formatting a Decimal Number

If we just want to print a decimal number with n digits after the decimal point, we can simply format the output String:

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI);
// OUTPUTS: Value with 3 digits after decimal point 3.142

Alternatively, we can format the value with the DecimalFormat class:

DecimalFormat df = new DecimalFormat("###.###");
System.out.println(df.format(PI));

DecimalFormat allows us to explicitly set rounding behavior, giving more control of the output than the String.format() used above.

4. Rounding Doubles With BigDecimal

To round doubles to n decimal places, we can write a helper method:

private static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(Double.toString(value));
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

There is one important thing to notice in this solution; when constructing BigDecimal, we must always use BigDecimal(String) constructor. This prevents issues with representing inexact values.

We can achieve the same result by using the Apache Commons Math library:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>

The latest version can be found here.

Once we add the library to the project, we can use the Precision.round() method, which takes two arguments – value and scale:

Precision.round(PI, 3);

By default, it is using the same HALF_UP rounding method as our helper method; therefore, the results should be the same.

Note that we can change rounding behavior by passing the desired rounding method as a third parameter.

5. Rounding Doubles With DoubleRounder

DoubleRounder is a utility in the decimal4j library. It provides a fast and garbage-free method for rounding doubles from 0 to 18 decimal points.

We can get the library (the latest version can be found here) by adding the dependency to the pom.xml:

<dependency>
    <groupId>org.decimal4j</groupId>
    <artifactId>decimal4j</artifactId>
    <version>1.0.3</version>
</dependency>

Now we can simply use:

DoubleRounder.round(PI, 3);

However, DoubleRounder fails in a few scenarios:

System.out.println(DoubleRounder.round(256.025d, 2));
// OUTPUTS: 256.02 instead of expected 256.03

6. Math.round() Method

Another way of rounding numbers is to use the Math.Round() Method.

In this case, we can control n number of decimal places by multiplying and dividing by 10^n:

public static double roundAvoid(double value, int places) {
    double scale = Math.pow(10, places);
    return Math.round(value * scale) / scale;
}

This method is not recommended as it’s truncating the value. In many cases values are rounded incorrectly:

System.out.println(roundAvoid(1000.0d, 17));
// OUTPUTS: 92.23372036854776 !!
System.out.println(roundAvoid(260.775d, 2));
// OUTPUTS: 260.77 instead of expected 260.78

As a result, this method is listed here for learning purposes only.

7. Conclusion

In this article, we covered different techniques for rounding numbers to n decimal places.

We can simply format the output without changing the value, or we can round the variable by using a helper method. We also discussed a few libraries that deal with this problem.

The code used in this article can be found over on GitHub.

Related posts:

Guide to @JsonFormat in Jackson
LIKE Queries in Spring JPA Repositories
Java Program to find the number of occurrences of a given number using Binary Search approach
Arrays.asList vs new ArrayList(Arrays.asList())
Spring REST API + OAuth2 + Angular
Java Program to Implement Variable length array
Java Program to Implement Binomial Tree
Java Program to do a Breadth First Search/Traversal on a graph non-recursively
Spring Boot - Enabling HTTPS
Java Program to Implement Sorted Singly Linked List
A Guide to ConcurrentMap
Recommended Package Structure of a Spring Boot Project
ThreadPoolTaskExecutor corePoolSize vs. maxPoolSize
Java Program to Search for an Element in a Binary Search Tree
Introduction to Spring Security Expressions
New Features in Java 12
Lập trình đa luồng với Callable và Future trong Java
Guide To CompletableFuture
Control Structures in Java
Spring Boot With H2 Database
Java Program to Check Whether an Undirected Graph Contains a Eulerian Cycle
Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Conne...
How to Use if/else Logic in Java 8 Streams
Java – Generate Random String
Java Program to Implement Merge Sort Algorithm on Linked List
Assert an Exception is Thrown in JUnit 4 and 5
Tính đa hình (Polymorphism) trong Java
Java Program to Test Using DFS Whether a Directed Graph is Strongly Connected or Not
Guide to Java OutputStream
Lớp Collectors trong Java 8
How to Remove the Last Character of a String?
Java Program to Perform Insertion in a 2 Dimension K-D Tree