Java - always keep two decimal places even in zeroes

17,200

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?

Share:
17,200

Related videos on Youtube

user3044874
Author by

user3044874

Updated on September 15, 2022

Comments

  • user3044874
    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 Eels
      Hovercraft Full Of Eels
      Are 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.
    • Lion
      Lion
    • Rahul
      Rahul
      Are you formatting m_interest using the DecimalFormat before printing it? Because I can see you doing Double.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.
    Benjamin W. over 8 years
    While 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
    ChandraBhan Singh over 6 years
    But 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
    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
    ChandraBhan Singh over 6 years
    In 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.