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.12
10.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
This line is your problem:
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)
Related Topics
Error When Running Rails App - Execjs::Runtimeerror
Ruby 1.9 Array.To_S Behaves Differently
Is There Any Wisdom Behind "And", "Or" Operators in Ruby
Query , Can Not Select Column Count
How to Avoid "Cannot Load Such File - Utils/Popen" from Homebrew on Osx
How to Find Out the Current Route in Rails
Rails: How to Change the Title of a Page
Rails 4: Assets Not Loading in Production
How to Pass Arguments into a Rake Task With Environment in Rails
Protected and Private Methods in Rails
Natural Language Processing in Ruby
Rvm and Thin, Root Vs. Local User
How to Change My Ruby Version Using Rvm