Формат Float до n десятичных знаков - PullRequest
209 голосов
/ 04 марта 2011

Мне нужно отформатировать число с плавающей запятой в «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

.

Ответы [ 10 ]

547 голосов
/ 21 марта 2011

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

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

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

39 голосов
/ 04 марта 2011

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

Редактировать : Пример

16 голосов
/ 07 декабря 2012

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

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

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

14 голосов
/ 17 июня 2016

Следует отметить, что использование конструктора 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));
6 голосов
/ 14 апреля 2016

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

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

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

4 голосов
/ 24 ноября 2015

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

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

2 голосов
/ 20 августа 2016

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

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;
}
2 голосов
/ 01 апреля 2016
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();
    }
1 голос
/ 08 июня 2018

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

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
1 голос
/ 04 марта 2011

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

return value.toString();

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

value.floatValue();

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

...