44.3 Precision Control and Rounding

Control decimal places and rounding behavior for consistent results.


44.3.1 Min/Max Fraction Digits

import java.text.NumberFormat;

NumberFormat nf = NumberFormat.getInstance(Locale.US);
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(4);

String s1 = nf.format(12.3);      // "12.30" (min 2)
String s2 = nf.format(12.34567);  // "12.3457" (max 4)

44.3.2 Rounding Modes

import java.text.DecimalFormat;
import java.math.RoundingMode;

DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
String s1 = df.format(1.235); // "1.24"

df.setRoundingMode(RoundingMode.DOWN);
String s2 = df.format(1.239); // "1.23"

Common modes:

  • HALF_UP: Round to nearest; ties away from zero
  • HALF_EVEN: Banker's rounding (ties to even)
  • DOWN: Truncate toward zero
  • CEILING: Round toward positive infinity

44.3.3 Formatting BigDecimal

import java.math.BigDecimal;

BigDecimal bd = new BigDecimal("123456.789012345");
DecimalFormat df = new DecimalFormat("#,##0.00");
df.setParseBigDecimal(true); // for parsing back to BigDecimal

String s = df.format(bd); // "123,456.79"

Ensure rounding mode matches your BigDecimal operations for consistency.


44.3.4 Grouping Control

DecimalFormat df = new DecimalFormat("#,##0.00");
df.setGroupingUsed(false);
String s = df.format(1234.56); // "1234.56" (no grouping)