Java - always keep two decimal places even in zeroes
Solution 1
It is because you are using Double.valueOf
on the DecimalFormat
and it is converting the formatted number back to a double, therefore eliminating the trailing 0s.
To fix this, only use the DecimalFormat
when you are displaying the value.
If you need m_interest
calculations, keep it as a regular double
.
Then when displaying, use:
System.out.print(df.format(m_interest));
Example:
DecimalFormat df = new DecimalFormat("#.00");
double m_interest = 1000;
System.out.print(df.format(m_interest)); // prints 1000.00
Solution 2
DecimalFormat and NumberFormat should work just fine. A currency instance could work even better:
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class Foo {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("#0.00");
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
NumberFormat cf = NumberFormat.getCurrencyInstance();
System.out.printf("0 with df is: %s%n", df.format(0));
System.out.printf("0 with nf is: %s%n", nf.format(0));
System.out.printf("0 with cf is: %s%n", cf.format(0));
System.out.println();
System.out.printf("12345678.3843 with df is: %s%n",
df.format(12345678.3843));
System.out.printf("12345678.3843 with nf is: %s%n",
nf.format(12345678.3843));
System.out.printf("12345678.3843 with cf is: %s%n",
cf.format(12345678.3843));
}
}
This would output:
0 with df is: 0.00
0 with nf is: 0.00
0 with cf is: $0.00
12345678.3843 with df is: 12345678.38
12345678.3843 with nf is: 12,345,678.38
12345678.3843 with cf is: $12,345,678.38
Solution 3
Use BigDecimal instead, which supports the formatting approach you seek.
This question details it: How to print formatted BigDecimal values?
Related videos on Youtube
user3044874
Updated on September 15, 2022Comments
-
user3044874 over 1 year
I am trying to keep two decimal places, even if then numbers are zeroes, using
DecimalFormatter
:DecimalFormat df = new DecimalFormat("#.00"); m_interest = Double.valueOf(df.format(m_principal * m_interestRate)); m_newBalance = Double.valueOf(df.format(m_principal + m_interest - m_payment)); m_principal = Double.valueOf(df.format(m_newBalance));
However for some values this gives two decimal places, and for others it doesnt. How can i fix this?
-
Hovercraft Full Of EelsAre you sure? I would use "#0.00" for my format String, but this should and will work. I have to wonder if you are in fact running the code that you show above.
-
LionFollow Java naming convention.
-
RahulAre you formatting
m_interest
using theDecimalFormat
before printing it? Because I can see you doingDouble.valueOf()
on the final result and if you're going to print that as such, then you're bound to get varying decimal points.
-
-
Benjamin W. over 8 yearsWhile this code may answer the question, it would be better to explain how it solves the problem without introducing others and why to use it. Code-only answers are not useful in the long run.
-
ChandraBhan Singh over 6 yearsBut I need to send value as double. Here df.format() output is of string type. Can somehow i send double value as 10.00, instead 10.0 ? Or I can't at all ?
-
Michael Yaworski over 6 years@ChandraBhanSingh That doesn't really make sense. A double is a numerical value; it is not formatted to have trailing zeros. If you need to print the number in some way, use
df.format()
before doing so. Besides printing the number, you can just leave it as a decimal. What situation is concerning you? -
ChandraBhan Singh over 6 yearsIn my project, we have signed off a document explicitly mentioning that double value would be off 4 precision. Now client is like we want those 4 zero after decimal points, i am really confused how to achieve this. Appreciate if you can tell me some catchy statements, so i can convince him regarding this. I am sending those values over JAX-WS webservice.