Формат Float до n десятичных знаков


221

Мне нужно отформатировать число с плавающей точкой "n" десятичных знаков.

пытался BigDecimal, но возвращаемое значение не является правильным ...

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}

Мне нужно вернуть значение с плавающей запятой с указанием количества десятичных знаков.

Мне нужно Floatвозвращать значение неDouble

,

Ответы:


561

Вы также можете передать значение с плавающей точкой и использовать:

String.format("%.2f", floatValue);

Документация


70
Пожалуйста, будьте осторожны, так как String.format зависит от вашей текущей локальной конфигурации, вы не можете получить точку в качестве разделителя. Предпочитают использоватьString.format(java.util.Locale.US,"%.2f", floatValue);
— Gomino

6
этот ответ дает строковое значение, а не значение с плавающей запятой, я не думаю, что хороший ответ.
— Чжао Ган

3
Зачем вам использовать точку в качестве разделителя?
— Марк Буйкема

1
@MarkBuikema Я думаю, что есть случаи, когда это было бы абсолютно необходимо, например, при компиляции форматов документов, основанных на стандартах, например. PDF документы.
— Tjaart

39

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

Изменить : пример


1
+1. Вот специфичная для Android документация , которая должна быть практически такой же.
— Зак Л

но мне нужен результат - число с плавающей точкой, а не строка.
— seba123neo

Вы говорите, что хотите обогнуть поплавок? Обычно единственная точность по времени имеет значение для отображения.
— Ник Кэмпион

извините, вы правы, я был сбит с толку, просто отформатируйте число, когда оно отображается на экране, а не раньше, это был мой вопрос, большое спасибо, проблема решена.
— seba123neo

Следует отметить, что использование DecimalFormatконструктора не рекомендуется, см. Мой ответ для правильного использования NumberFormat.
— FBB

17

Попробуйте это, это мне очень помогло

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);

Результат будет roundfinalPrice -> 5652.26


2
Это более полезно для тех, кто хочет округлить и сделать некоторые дальнейшие вычисления с ним, в противном случае ответ Арве, вероятно, будет лучшим.
— Джерард

Это работает и с GWT. String.format () - нет.
— AlexV

15

Следует отметить, что использование DecimalFormatконструктора не рекомендуется. Javadoc для этого класса гласит:

В общем случае не вызывайте конструкторы DecimalFormat напрямую, поскольку фабричные методы NumberFormat могут возвращать подклассы, отличные от DecimalFormat.

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

Итак, что вам нужно сделать, это (например):

NumberFormat formatter = NumberFormat.getInstance(Locale.US);
formatter.setMaximumFractionDigits(2);
formatter.setMinimumFractionDigits(2);
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue));

Это не работает, когда (например) floatValue = 8.499. Это дает 8.5.
— Шива Кришна Чиппа

3
@ShivakrishnaChippa: да, потому что здесь мы указываем, что мы хотим 2 цифры после запятой, и сделать округление вверх. В этом случае 8,499 округляется до 8,5. Если вы хотите, чтобы отображалось 8.499, просто установите 3 в качестве максимальных цифр дроби.
— FBB

6

Вот быстрый пример с использованием DecimalFormatкласса, упомянутого Ником.

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

Выходные данные оператора печати будут 12,35. Обратите внимание, что он будет округлять его для вас.


Следует отметить, что использование DecimalFormatконструктора не рекомендуется, см. Мой ответ для правильного использования NumberFormat.
— FBB

5

Кинда удивилась, что никто не указал прямой способ сделать это, что достаточно просто.

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}

Я уверен, что это не делает даже половину округления.

Что бы это ни стоило, округление до половины даже будет хаотичным и непредсказуемым всякий раз, когда вы смешиваете двоичные значения с плавающей точкой с арифметикой с основанием 10. Я уверен, что это невозможно сделать. Основная проблема заключается в том, что значение типа 1.105 не может быть представлено точно с плавающей запятой. Значение с плавающей запятой будет что-то вроде 1.105000000000001 или 1.104999999999999. Таким образом, любая попытка выполнить полуначетное округление приводит к ошибкам в представительном кодировании.

Реализации IEEE с плавающей запятой будут выполнять половину округления, но они выполняют двоичное, а не десятичное. Так что вы, вероятно, в порядке


Я также использовал этот метод некоторое время, но я думаю, что powэто слишком дорогая операция для округления?
— Xerus

Никогда не оптимизируйте, пока у вас не возникнут проблемы с производительностью. Важнее быть правым, чем быстрым. И я не могу честно представить себе приложение, в котором производительность контролируемого округления была бы проблемой, если бы вы не были Visa или Mastercard (которые просто добавили бы больше машин). И pow (), вероятно, быстрее, чем round ().
— Робин Дэвис,

2
public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }

2

Это гораздо менее профессиональный и более дорогой способ, но он должен быть проще для понимания и более полезным для начинающих.

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}

1

Я думаю, что вы хотите, это

return value.toString();

и используйте возвращаемое значение для отображения.

value.floatValue();

всегда будет возвращать 625,3, потому что он в основном используется для вычисления чего-либо.


но мне нужен результат - число с плавающей точкой, а не строка.
— seba123neo

2
если вам нужен поплавок, чтобы показать его пользователю, возможно, что-то не так с дизайном приложения. Обычно float используется для вычисления, а строка используется для его отображения пользователю.
— n3utrino

извините, вы правы, я был сбит с толку, просто отформатируйте число, когда оно отображается на экране, а не раньше, это был мой вопрос, большое спасибо, проблема решена.
— seba123neo

1

Я искал ответ на этот вопрос, а потом разработал метод! :) Справедливое предупреждение, это округляет значение.

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}

0

Вы можете использовать десятичный формат, если хотите отформатировать число в строку, например:

String a = "123455";
System.out.println(new 
DecimalFormat(".0").format(Float.valueOf(a)));

Выход этого кода будет:

123455,0

Вы можете добавить больше нулей в десятичный формат, в зависимости от того, какой вывод вы хотите.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.