Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 589
Satellite Sage Avatar asked Apr 29 '19 13:04

Satellite Sage


4 Answers

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.

like image 156
Tim Biegeleisen Avatar answered Dec 19 '22 03:12

Tim Biegeleisen


In order to fit your first pattern better i would just remove the first #. Like this you fit international unit system while keeping optional numbers after point.

DecimalFormat eNotation1 = new DecimalFormat("0.###E0");   
System.out.println(eNotation1.format(123.456789));
like image 44
PopHip Avatar answered Dec 19 '22 03:12

PopHip


Seems like this pattern will work as you expect

DecimalFormat eNotation1 = new DecimalFormat("0.000E0");
like image 36
Naya Avatar answered Dec 19 '22 04:12

Naya


Basically, Using 0s for your pattern causes the formatter to use the specific digits in place and convert the remaining to Exponential Notation.

Using #s for the same pattern, makes all remaining digits fit into the number of places specified, before applying exponents, meaning your specific use case will be rounded, then the remaining digits will be added to the Exponent.

Granted the Docs aren't that clear on it: https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html.

"123456.789 ###.## 123456.79 The value has three digits to the right of the decimal point, but the pattern has only two. The format method handles this by rounding up."

like image 23
user1431356 Avatar answered Dec 19 '22 04:12

user1431356