Формат 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.