Десятичный форматер java doc описывает, как обращаться с экспонентой.
Научная нотация
Числа в научной нотации выражаются как произведение мантиссы, а степень десяти, например, 1234, может быть выражена как 1,234 x 10 ^ 3.Мантисса часто находится в диапазоне 1,0 <= х <10,0, но это не обязательно.DecimalFormat может быть задан для форматирования и анализа научной нотации только через шаблон;в настоящее время нет фабричного метода, который бы создавал формат научной нотации.В шаблоне знак экспоненты, за которым сразу следует один или несколько цифр, обозначает научное обозначение.Пример: «0. ### E0» форматирует число 1234 как «1.234E3».... </p>
Более сложная часть состоит в том, как переключаться между обычной и научной нотацией.Я сделал это, вставив два десятичных форматера в форматирующий элемент выбора в Messageformater:
MessageFormat format = new MessageFormat(
"{0,choice,0#{0,number,'#,##0.####'}|99999<{0,number,'000000.####E0'}}",
Locale.ENGLISH);
(в этом примере только 6 десятичных знаков, но вы можете изменить его.)
Использование формата сообщения немного отличается от десятичного форматера, потому что метод формата ожидает массив объектов.
System.out.println(format.format(new Object[] { 123 }));
Для чего он печатает (1, 12, 123,...):
1
1.1
12
123
1,234
12,345
123456E0
123456.7E1
123456.78E2
123456.789E3
123456.789E4
123456.789E5
123456.789E6
Вам нужно немного настроить шаблон, чтобы он соответствовал вашему требованию 20 дигетов, но путь должен быть ясным.
Даже если бы я показал, что это работает, я бы порекомендовал реализовать свой собственный Formater, который использует 2 десятичных форматера и условие if.