Search code examples
javadecimalformatscientific-notation

Why was the pattern string not followed in this code?


When following code is executed:

DecimalFormat eNotation1 = new DecimalFormat("#0.###E0");   
System.out.println(eNotation1.format(123.456789)); 

My expected output is;

1.235E2

instead,

1.2346E2

was printed.

Why was the output 1.2346E2?

I know I could have used a method like setMaximumFractionDigits() if all I wanted was to set the maximum number of digits after the decimal point, but I just really want to understand why the output was 1.2346E2


Solution

  • If you want that exact format, then use the pattern 0.000E0:

    DecimalFormat eNotation1 = new DecimalFormat("0.000E0");
    System.out.println(eNotation1.format(123.456789));
    
    1.235E2
    

    As to why you are seeing your current behavior, the # placeholders are optional digits, which means that DecimalFormat is not obligated to actually use them exactly as you used them in the pattern. The only requirement appears to be that the total number of digits appearing in the scientific notation output matches. In this case, the total number of digits is five, so we get the output 1.2346E2.