Вывод числа double без экспоненциальной нотации в Java
Быстрый ответ
Чтобы отобразить числа типа double без использования научной нотации в Java, воспользуйтесь классом DecimalFormat
:
double value = 1234.56;
System.out.println(new DecimalFormat("0.######").format(value));
После выполнения этого кода на экран будет выведено значение 1234.56
, причём без применения научной нотации. Вы можете самостоятельно настроить формат "0.######"
в соответствии с тем, сколько знаков после запятой вам нужно отобразить.
Тонкая настройка форматирования
Использование DecimalFormat для контроля точности
С помощью класса DecimalFormat
вы можете управлять количеством знаков после запятой при выводе чисел типа double:
double pi = Math.PI;
DecimalFormat decimalFormat = new DecimalFormat("#.00000");
System.out.println(decimalFormat.format(pi)); // Отформатированное число Пи: 3.14159
Чтобы адаптировать DecimalFormat
к формату принятому в различных локализациях, можно использовать следующий код:
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.ENGLISH);
decimalFormat.setDecimalFormatSymbols(symbols); // Перенастройка формата под английскую локализацию
Применение BigDecimal для работы с особо большими или маленькими числами
При работе с особенно большими или малыми числами полезно воспользоваться классом BigDecimal
. Метод toPlainString()
позволяет отобразить число без использования научной нотации:
double value = 0.00000000002;
BigDecimal bigDecimal = new BigDecimal(String.valueOf(value));
System.out.println(bigDecimal.toPlainString()); // Без использования научной нотации: 0.00000000002
Для более точного представления числа создайте объект BigDecimal
из строкового представления числа типа double:
double value = 0.0000003;
BigDecimal exactBigDecimal = new BigDecimal(Double.toString(value));
System.out.println(exactBigDecimal.toPlainString()); // Верное представление: 0.0000003
Форматирование чисел с помощью printf
Если вы привыкли форматировать числа с использованием printf
, вы также можете это сделать:
double value = 3.14159;
System.out.printf("%.2f", value); // Точность до второго знака после запятой
Количество знаков после запятой можно настроить, изменив значение в %.2f
.
Визуализация
Отображение чисел типа double без научной нотации можно представить примерно так:
Исходное значение: 123456.789
При игнорировании точности (🔬): 1.23456789E5
Восприятие: "Больше похоже на код для запуска ракеты, чем на число!"
С учётом точности (📏): 123456.789
Восприятие: "Верно, 123,456.789 метров. Это ведь не ракетная наука, просто измерение длины!"
Используя DecimalFormat
или String.format
, вы можете избежать использования научной нотации:
DecimalFormat formatter = new DecimalFormat("#.#####");
System.out.println(formatter.format(123456.789)); // Точное и красивое: 123456.789
System.out.println(String.format("%.5f", 123456.789)); // Добавление нулей: 123456.78900
Пусть в вашей работе будет только точность, без лишних сложностей!
Продвинутые способы форматирования чисел типа double
Особые значения чисел с плавающей запятой
Перед выводом числа типа double стоит проверять, не обнаруживается ли каких-то специальных значений:
double notANumber = Double.NaN;
double infinity = Double.POSITIVE_INFINITY;
if (Double.isNaN(notANumber) || Double.isInfinite(infinity)) {
System.out.println("Внимание, обнаружено необычное значение!");
}
Влияние локализации на форматирование через DecimalFormat
Помните, что при использовании DecimalFormat
применяется формат, принятый в выбранной локализации:
DecimalFormat decimalFormat = new DecimalFormat("#.00");
decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.FRENCH));
System.out.println(decimalFormat.format(123456.789)); // Французский привет: 123 456,79!
Преодоление проблем точности при работе с типом double
Тип double
достаточно удобен для применения в вычислениях, однако из-за своего бинарного представления может давать неточные результаты:
System.out.println(0.1 + 0.2); // Не совсем точный результат: 0.30000000000000004
Если для вас точность имеет критическое значение, предпочтительнее использовать BigDecimal
.
Полезные материалы
- DecimalFormat (Java Platform SE 7) — класс для форматирования чисел без применения научной нотации.
- BigDecimal (Java Platform SE 7) — для контроля над точностью используйте
BigDecimal
. - Formatter (Java Platform SE 7) — выведите данные с требуемой точностью.
- PrintStream (Java Platform SE 7) — форматируйте вывод данных с помощью функции
printf
. - NumberFormat (Java Platform SE 7) — применяйте для локализованного форматирования чисел, соответствующего представлениям различных языков и культур.