Почему в этом коде не использовалась строка шаблона? - PullRequest
15 голосов
/ 29 апреля 2019

Когда выполняется следующий код:

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

Мой ожидаемый вывод:

1.235E2

вместо

1.2346E2

.

Почему был вывод 1.2346E2?

Я знаю, что мог бы использовать такой метод, как setMaximumFractionDigits(), если бы все, что я хотел, это установить максимальное количество цифрпосле десятичной точки, но я просто очень хочу понять, почему вывод был 1.2346E2

Ответы [ 4 ]

15 голосов
/ 29 апреля 2019

Если вы хотите точный формат, используйте шаблон 0.000E0:

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

1.235E2

Что касается , почему вы видите свое текущее поведение, # заполнителями являются необязательные цифры, что означает, что DecimalFormat не обязан фактически использовать их точно так же, как вы использовал их в шаблоне. Похоже, что единственным требованием является совпадение общего количества цифр в выводе научной нотации. В этом случае общее количество цифр равно пяти, поэтому мы получаем вывод 1.2346E2.

3 голосов
/ 29 апреля 2019

Чтобы лучше соответствовать вашему первому шаблону, я бы просто удалил первый #.Таким образом, вы подходите международной системе единиц, сохраняя дополнительные цифры после точки.

DecimalFormat eNotation1 = new DecimalFormat("0.###E0");   
System.out.println(eNotation1.format(123.456789));
2 голосов
/ 29 апреля 2019

Похоже, этот шаблон будет работать так, как вы ожидаете

DecimalFormat eNotation1 = new DecimalFormat("0.000E0");
1 голос
/ 29 апреля 2019

В основном, использование 0 для шаблона приводит к тому, что средство форматирования использует определенные цифры на месте и преобразует оставшиеся в экспоненциальную запись.

Использование # для одного и того же шаблона приводит к тому, что все оставшиеся цифры вписываются в указанное количество мест перед применением показателей, то есть ваш конкретный вариант использования будет округлен, а остальные цифры будут добавлены к экспоненте.

Конечно, Документы не так ясны: https://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html.

"123456.789 ###. ## 123456.79 Значение имеет три цифры справа от десятичной точки, но шаблон имеет только две. Метод форматирования обрабатывает это путем округления в большую сторону."

...