There are a few ways to round float or double to 2 decimal places in Java.
Note
In short, for monetary calculation, picks
BigDecimal; for display purpose, picksDecimalFormat("0.00").
1. DecimalFormat(“0.00”)
We can use DecimalFormat("0.00") to ensure the number always round to 2 decimal places. For DecimalFormat, the default rounding mode is RoundingMode.HALF_EVEN, and we can use setRoundingMode(RoundingMode) to set a specified rounding mode.
DecimalExample.java
package com.favtuts.classic;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class RoundDecimal {
private static final DecimalFormat df = new DecimalFormat("0.00");
public static void main(String[] args) {
roundDecimalWithDecimalFormat();
}
static void roundDecimalWithDecimalFormat() {
double input = 1205.6358;
System.out.println("salary : " + input);
// DecimalFormat, default is RoundingMode.HALF_EVEN
System.out.println("salary : " + df.format(input)); // 1205.64
df.setRoundingMode(RoundingMode.DOWN);
System.out.println("salary : " + df.format(input)); // 1205.63
df.setRoundingMode(RoundingMode.UP);
System.out.println("salary : " + df.format(input)); // 1205.64
}
}
Output
salary : 1205.6358
salary : 1205.64
salary : 1205.63
salary : 1205.64
2. DecimalFormat(“0.00”) vs DecimalFormat(“#.##”)
The below shows the difference between DecimalFormat("0.00") and DecimalFormat("#.##").
DecimalExample2.java
package com.favtuts.classic;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class RoundDecimal {
private static final DecimalFormat dfZero = new DecimalFormat("0.00");
private static final DecimalFormat dfSharp = new DecimalFormat("#.##");
public static void main(String[] args) {
roundDecimalWithDecimalFormatDifference();
}
static void roundDecimalWithDecimalFormatDifference() {
double input = 1205.6;
System.out.println("salary : " + input);
System.out.println("salary 0.00 : " + dfZero.format(input));
System.out.println("salary #.## : " + dfSharp.format(input));
double input2 = 1205.60;
System.out.println("salary : " + input2);
System.out.println("salary 0.00 : " + dfZero.format(input2));
System.out.println("salary #.## : " + dfSharp.format(input2));
}
}
Output
salary : 1205.6
salary 0.00 : 1205.60
salary #.## : 1205.6
salary : 1205.6
salary 0.00 : 1205.60
salary #.## : 1205.6
DecimalFormat("#.##") displays blank if the second decimal place is empty or zero. The DecimalFormat("0.00") is a better solution for 2 decimal places.
3. BigDecimal
We also can convert the double to a BigDecimal object and set the scale and rounding mode.
BigDecimalExample.java
package com.favtuts.classic;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class RoundDecimal {
public static void main(String[] args) {
roundDecimalWithBigDecimal();
}
static void roundDecimalWithBigDecimal() {
// double input = 3.14159265359;
double input = 1205.6358;
System.out.println("double : " + input);
// convert double to BigDecimal
BigDecimal salary = new BigDecimal(input);
System.out.println("BigDecimal: " + salary);
// round to 2 decimal places
BigDecimal salary2 = salary.setScale(2, RoundingMode.HALF_UP);
System.out.println("BigDecimal: " + salary2);
// one line
BigDecimal salary3 = new BigDecimal(input).setScale(2, RoundingMode.HALF_UP);
System.out.println("BigDecimal: " + salary3);
// convert BigDecimal back to double
double salary4 = salary3.doubleValue();
System.out.println("double : " + salary4);
}
}
Output
double : 1205.6358
BigDecimal: 1205.63580000000001746229827404022216796875
BigDecimal: 1205.64
BigDecimal: 1205.64
double : 1205.64
4. String.format(“%.2f”, input)
The String.format is working fine, and the default rounding is half-up; however, we have no way to configure the type of rounding mode.
StringFormatExample.java
package com.favtuts.classic;
public class RoundDecimal {
public static void main(String[] args) {
roundDecimalWithStringFormat();
}
static void roundDecimalWithStringFormat() {
double input = 1205.6358;
System.out.println("salary : " + input);
// round half-up, no way control
// 1205.64
System.out.println("salary : " + String.format("%.2f", input));
// 1205.64
System.out.format("salary : %.2f", input);
}
}
Output
salary : 1205.6358
salary : 1205.64
salary : 1205.64
5. Math.round
5.1 This Math.round is for educational purposes 🙂
MathExample.java
package com.favtuts.classic;
public class RoundDecimal {
public static void main(String[] args) {
roundDecimalWithMathRound();
}
static void roundDecimalWithMathRound() {
double input = 1205.6358;
System.out.println("salary : " + input);
double salary = Math.round(input * 100.0) / 100.0;
System.out.println("salary : " + salary);
}
}
Output
salary : 1205.6358
salary : 1205.64
input = 1205.6358;
Math.round(input * 100.0) / 100.0;
Math.round(120563.58) / 100.0;
120564 / 100.0;
salary = 1205.64
5.2 For 3 decimal places, try * 1000.
double input = 1205.6358;
double salary = Math.round(input * 1000.0) / 1000.0;
System.out.println("salary : " + salary);
Output
salary : 1205.6358
salary : 1205.636
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-basic/classic