Перейти к основному содержимому

Как перевести Double в String с удалением десятичных разрядов?

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Введение

В этом руководстве мы рассмотрим различные способы преобразования значения типа double в String с удалением десятичных разрядов.

Мы рассмотрим, как это сделать, когда мы хотим просто обрезать десятичную часть и когда мы хотим ее округлить.

2. Усечение с помощью приведения

Если наше значение типа double находится в пределах диапазона int , мы можем привести его к типу int . Приведение усекает десятичную часть, то есть обрезает ее без округления.

Этот подход примерно в 10 раз быстрее, чем другие подходы, которые мы рассмотрим.

Как только это будет int, мы можем передать его методу valueOf в классе String :

String truncated = String.valueOf((int) doubleValue);

Мы можем с уверенностью использовать этот подход, когда нам гарантировано, что значение double находится в пределах диапазона int . Но если наше значение превышает это значение, приведение не будет работать так, как нам бы хотелось .

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 можно использовать для форматирования двойных значений. Однако вместо того, чтобы задавать формат вывода с помощью вызовов методов, мы можем указать средству форматирования, какой вывод нам нужен, предоставив конструктору определенный шаблон:

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 для больших значений типа double .

Мы можем использовать метод setScale BigDecimal , чтобы указать, хотим ли мы округлить или усечь: ``

double largeDouble = 345_345_345_345.56;
BigDecimal big = new BigDecimal(largeDouble);
big = big.setScale(0, RoundingMode.HALF_UP);

Помните, что BigDecimal являются неизменяемыми, поэтому, как и строки, нам нужно сбросить значение.

И затем мы просто вызываем toString BigDecimal : ``

String rounded = big.toString();

7. Заключение

В этом уроке мы рассмотрели различные способы преобразования числа double в строку с удалением десятичных знаков. Мы предоставили подходы, которые будут выводить либо округленные, либо усеченные значения.

Как обычно, образцы и тесты доступны на GitHub .