Использование DecimalFormat
Класс DecimalFormat имеет различные параметры формата для округления десятичных знаков в зависимости от инициализированного формата. В приведенном ниже примере мы инициализировали в формате как . Это означает, что десятичный разряд ограничивается двумя цифрами.
Мы также можем использовать метод округления числа до n десятичных знаков для инициализированного формата. Например, и округляет цифру до меньшего значения. Остальные режимы округления округляют до максимального значения.
import java.math.RoundingMode; import java.text.DecimalFormat; public class DecimalFormatDemo { public static void main(String[] args) { Double d = 1234.675389; DecimalFormat df = new DecimalFormat("#.##"); System.out.println("Original input value: " + d); System.out.println("Using DecimalForamt: " + df.format(d)); df.setRoundingMode(RoundingMode.DOWN); System.out.println("Using Rounding mode DOWN: " + df.format(d)); df.setRoundingMode(RoundingMode.CEILING); System.out.println("Using Rounding mode CEILING: " + df.format(d)); df.setRoundingMode(RoundingMode.UP); System.out.println("Using Rounding mode UP: " + df.format(d)); df.setRoundingMode(RoundingMode.FLOOR); System.out.println("Using Rounding mode FLOOR: " + df.format(d)); df.setRoundingMode(RoundingMode.HALF_DOWN); System.out.println("Using Rounding mode HALFDOWN: " + df.format(d)); df.setRoundingMode(RoundingMode.HALF_EVEN); System.out.println("Using Rounding mode HALFEVEN: " + df.format(d)); df.setRoundingMode(RoundingMode.HALF_UP); System.out.println("Using Rounding mode HALFUP: " + df.format(d)); } }
Original input value: 1234.675389 Using DecimalForamt: 1234.68 Using Rounding mode DOWN: 1234.67 Using Rounding mode CEILING: 1234.68 Using Rounding mode UP: 1234.68 Using Rounding mode FLOOR: 1234.67 Using Rounding mode HALFDOWN: 1234.68 Using Rounding mode HALFEVEN: 1234.68 Using Rounding mode HALFUP: 1234.68
DecimalFormat
Еще один вариант — использовать класс
DecimalFormat
. Он предназначен для форматирования любого числа в Java, будь это целое число или число с плавающей запятой.При создании экземпляра
DecimalFormat
мы можем передать ему строку форматирования. Она укажет, сколько десятичных разрядов нужно отформатировать для ввода. Как будет выглядеть наш пример с использованием
DecimalFormat
double value = 34.766674;DecimalFormat decimalFormat = new DecimalFormat( “#.###” );String result = decimalFormat.format(value);System.out.print(result);//34,767
Строка
#.###
— это шаблон, который указывает, что мы форматируем передаваемое значение до 3 десятичных знаков.Чтобы изменить шаблон после создания объекта DecimalFormat, можно использовать его методы
applyPattern
и
applyLocalizedPattern
DecimalFormat decimalFormat = new DecimalFormat(“#.###”);decimalFormat.applyPattern(“#.#”);decimalFormat.applyLocalizedPattern(“#.#####”);
Но мы сегодня говорим про округление, не правда ли? При обрезании числа с знаками после запятой, выходящими за заданный шаблон,
DecimalFormat
округляет число в большую сторону, если последний обрезаемое число больше 5. Но что если число — 5? Получается, что оно ровно посередине между ближайшими целыми. Что тогда?В этом случае учитывается предыдущее число.Если оно чётное, округление производится:
DecimalFormat decimalFormat = new DecimalFormat(“#.###”);String result = decimalFormat.format(7.4565);System.out.println((result));// 7,457
Если нечётное — не производится:
DecimalFormat decimalFormat = new DecimalFormat(“#.###”);String result = decimalFormat.format(7.4575);System.out.println((result));// 7,457
Есть небольшая разница между форматированием чисел с плавающей запятой с использованием String.format() и DecimalFormat.format(). Первый всегда будет печатать конечные нули, даже если нет дробной части. К примеру:
String firstResult = String.format(“%.3f”, 7.000132);System.out.println((firstResult)); // 7.000DecimalFormat decimalFormat = new DecimalFormat(“#.###”);String secondResult = decimalFormat.format(7.000132);System.out.println((secondResult)); // 7
Как мы видим, при форматировании числа 7.000132 с точностью до трёх десятичных разрядов, метод format() у String выводит 7.000, в то время как у DecimalFormat метод format() выведет 7.То есть вы можете выбирать
String.format()
или
DecimalFormat.format()
в зависимости от того, нужны ли вам конечные нули или нет.Применяя вышеописанные способы, мы получали результат в виде строки. Давайте же рассмотрим способы, как можно получить обратно именно числовые значения.
Метод Math.round() java
При использовании метода Math.round() можно контролировать п-количество десятичных разрядов путем умножения и деления на 10^п :
public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }
Этот метод не рекомендуется использовать для округления чисел, поскольку он усекает значение. Во многих случаях значения округляются неправильно:
System.out.println(roundAvoid(1000.0d, 17)); // Вывод: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // Вывод: 260.77 вместо ожидаемого 260.78
Использование метода format ()
В этом примере мы увидим, как использовать метод format () для ограничения десятичных разрядов. Первый аргумент определяет формат. обозначает 2 десятичных знака, обозначает 3 десятичных знака и так далее. Следовательно, в аргументе формата мы можем указать предел десятичных знаков. Второй аргумент — это входное значение.
public class LimitDecimalDemo { public static void main(String[] args) { Double d = 12345.783214; System.out.println("Original value: " + d); System.out.println("2 decimal format: "); System.out.format("%.2f", d); System.out.println("\n3 decimal format: "); System.out.format("%.3f", d); System.out.println("\n4 decimal format: "); System.out.format("%.4f", d); } }
Original value: 12345.783214 2 decimal format: 12345.78 3 decimal format: 12345.783 4 decimal format: 12345.7832
Що потрібно для навчання?
Для того, щоб почати начання у Vertex Academy:
- Необхідно зателефонувати за телефоном 050 205 77 99 або 098 205 77 99, або на нашому сайті vertex-academy.com відправити заявку на зворотній дзвінок. Узгодити з менеджером Vertex Academy час співбесіди, прийти і підписати договір, і … вуаля! – почати заняття в призначений день.
- Величезне бажання стати програмістом. Тому що вчитися доведеться багато. Але воно того варте, якщо Вам дійсно подобається програмувати.
Хочете вивчити основи програмування з нуля або підвищити рівень своїх знань і готові багато працювати? Приходьте до нас!
У Vertex Academy проводяться курси програмування за напрямами:
Java з нуля Java ООП Java Professional Front-end
А також:
English for IT
String format
В качестве первого способа мы рассмотрим округление double:
double value = 34.766674;String result = String.format(“%.3f”,value);System.out.print(result);// 34,767
В результате мы отформатируем наше число с плавающей запятой 34766674 с точностью до
3 десятичных разрядов
, так как в инструкции для форматирования мы указали три знака после запятой “%.3f.В свою очередь %f при форматировании строки обозначает тип чисел с плавающей запятой, которое включает в себя тип данных
double
и
float
в Java.В примере выше мы выводили полученное значение в консоль. Теперь вопрос: как бы можно было это сократить? Все просто: нужно использовать printf, который в свою очередь является format + print. В итоге предыдущий пример у нас сократился бы до:
double value = 34.766674;System.out.printf(“%.3f”,value);
У экземпляра out класса
PrintStream
помимо этого метода есть ещё метод format, который работает аналогично:
double value = 34.766674;System.out.format(“%.3f”,value);
Округление происходит по режиму
HALF_UP
— в сторону числа, которое ближе к обрезаемому (к 0 или 10). Если же эти числа равноудалены (в случае с 5), то округление выполняется в большую сторону.Пример:
String firstResult = String.format(“%.3f”,7.0004);// 7,000String secondResult = String.format(“%.3f”,7.0005);// 7,001String thirdResult = String.format(“%.3f”,7.0006);// 7,001
Более подробно режимы округления мы разберем чуть ниже.