﻿ How to Convert a Bigdecimal to a 2-Decimal-Place String - ITCodar

# How to Convert a Bigdecimal to a 2-Decimal-Place String

## Format a BigDecimal as String with max 2 decimal digits, removing 0 on decimal part

I used `DecimalFormat` for formatting the `BigDecimal` instead of formatting the `String`, seems no problems with it.

The code is something like this:

``bd = bd.setScale(2, BigDecimal.ROUND_DOWN);DecimalFormat df = new DecimalFormat();            df.setMaximumFractionDigits(2);            df.setMinimumFractionDigits(0);            df.setGroupingUsed(false);String result = df.format(bd);``

## How can I convert a BigDecimal to a 2-decimal-place string?

How about combining `BigDecimal#truncate` and `String#%`? :

``"%.2f" % BigDecimal("7.1762").truncate(2)# => "7.17""%.2f" % BigDecimal("4.2").truncate(2)# => "4.20"``

## Rounding Bigdecimal values with 2 Decimal Places

I think that the `RoundingMode` you are looking for is `ROUND_HALF_EVEN`. From the javadoc:

Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. Behaves as for ROUND_HALF_UP if the digit to the left of the discarded fraction is odd; behaves as for ROUND_HALF_DOWN if it's even. Note that this is the rounding mode that minimizes cumulative error when applied repeatedly over a sequence of calculations.

Here is a quick test case:

``BigDecimal a = new BigDecimal("10.12345");BigDecimal b = new BigDecimal("10.12556");a = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);b = b.setScale(2, BigDecimal.ROUND_HALF_EVEN);System.out.println(a);System.out.println(b);``

Correctly prints:

``10.1210.13``

UPDATE:

`setScale(int, int)` has not been recommended since Java 1.5, when enums were first introduced, and was finally deprecated in Java 9. You should now use `setScale(int, RoundingMode)` e.g:

`setScale(2, RoundingMode.HALF_EVEN)`

## Convert string to decimal number with 2 decimal places in Java

``litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));``

There you formatted your float to string as you wanted, but but then that string got transformed again to a float, and then what you printed in stdout was your float that got a standard formatting. Take a look at this code

``import java.text.DecimalFormat;String stringLitersOfPetrol = "123.00";System.out.println("string liters of petrol putting in preferences is "+stringLitersOfPetrol);Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);DecimalFormat df = new DecimalFormat("0.00");df.setMaximumFractionDigits(2);stringLitersOfPetrol = df.format(litersOfPetrol);System.out.println("liters of petrol before putting in editor : "+stringLitersOfPetrol);``

And by the way, when you want to use decimals, forget the existence of double and float as others suggested and just use BigDecimal object, it will save you a lot of headache.

## Rounding BigDecimal to *always* have two decimal places

``value = value.setScale(2, RoundingMode.CEILING)``