«1. Введение
В этом уроке мы рассмотрим различные способы преобразования значения типа double в строку с удалением десятичных разрядов.
Мы рассмотрим, как это сделать, когда мы хотим просто обрезать десятичную часть и когда мы хотим ее округлить.
2. Усечение с использованием приведения типов
Если наше значение типа double находится в пределах диапазона int, мы можем привести его к типу int. Приведение усекает десятичную часть, то есть обрезает ее без округления.
Этот подход примерно в 10 раз быстрее, чем другие подходы, которые мы рассмотрим.
Как только это будет int, мы можем передать его методу valueOf в классе String:
String truncated = String.valueOf((int) doubleValue);
Мы можем уверенно использовать этот подход, когда мы гарантируем, что значение double находится в пределах диапазона внутр. Но если наше значение превышает это значение, приведение не будет работать так, как нам бы хотелось.
3. Округление с помощью String.format()
Остальные подходы не так ограничены, как приведение типов, но имеют свои нюансы.
Например, другой подход заключается в использовании метода форматирования класса String. Первый параметр метода указывает, что мы форматируем значение с плавающей запятой с нулевыми цифрами после десятичной точки:
String rounded = String.format("%.0f", doubleValue);
Метод форматирования использует округление HALF_UP, которое будет округляться, если значение после дробной части равно 0,5 или выше. В противном случае возвращается число до десятичной точки.
И хотя это просто, String.format — самый медленный способ сделать это.
4. Использование NumberFormat.format()
Класс NumberFormat также предоставляет метод форматирования, аналогичный классу String, но NumberFormat работает быстрее, и с его помощью мы можем указать режим округления для достижения либо усечения, либо округления.
Метод setMaximumFractionDigits() сообщает средству форматирования, сколько дробных цифр после запятой следует включить в вывод:
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(0);
String rounded = nf.format(doubleValue);
Любопытно, что NumberFormat по умолчанию не использует HALF_UP. Вместо этого по умолчанию используется округление HALF_EVEN, что означает, что оно будет округляться как обычно, за исключением 0,5, и в этом случае будет выбрано ближайшее четное число.
Хотя HALF_EVEN полезен для статистического анализа, давайте использовать HALF_UP для согласованности:
nf.setRoundingMode(RoundingMode.HALF_UP);
String rounded = nf.format(doubleValue);
И мы можем изменить это и добиться усечения, настроив средство форматирования на использование вместо этого режима округления FLOOR:
nf.setRoundingMode(RoundingMode.FLOOR);
String truncated = nf.format(doubleValue)
~~ ~ И теперь он будет усекаться, а не округляться.
5. Использование DecimalFormat.format()
Как и в случае с NumberFormat, класс DecimalFormat можно использовать для форматирования значений типа double. Однако вместо того, чтобы задавать формат вывода с помощью вызовов методов, мы можем сообщить средству форматирования, какой вывод мы хотим, предоставив конструктору определенный шаблон:
DecimalFormat df = new DecimalFormat("#,###");
df.setRoundingMode(RoundingMode.HALF_UP);
String rounded = df.format(doubleValue);
Шаблон «#,###» означает, что мы хотим, чтобы средство форматирования возвращало только целую часть ввода. Это также сигнализирует о том, что мы хотим, чтобы цифры были сгруппированы по три, разделенные запятой.
Здесь применяются те же значения округления по умолчанию, поэтому, если мы хотим вывести усеченное значение, мы можем установить режим округления на FLOOR:
df.setRoundingMode(RoundingMode.FLOOR);
String truncated = df.format(doubleValue)
6. Использование BigDecimal.toString()
Последний подход, который мы посмотрите на BigDecimal, который мы включим, потому что он превосходит NumberFormat и DecimalFormat для больших удвоений.
Мы можем использовать метод setScale BigDecimal, чтобы указать, хотим ли мы округлить или обрезать:
double largeDouble = 345_345_345_345.56;
BigDecimal big = new BigDecimal(largeDouble);
big = big.setScale(0, RoundingMode.HALF_UP);
Помните, что BigDecimals неизменяемы, поэтому, как и строки, нам нужно сбросить значение.
И затем мы просто вызываем toString из BigDecimal:
String rounded = big.toString();
7. Заключение
В этом уроке мы рассмотрели различные способы преобразования типа double в String при удалении десятичные знаки. Мы предоставили подходы, которые будут выводить либо округленные, либо усеченные значения.
Как обычно, образцы и тесты доступны на GitHub.