Формат Float до n знаков после запятой

Мне нужно отформатировать float до десятичных знаков "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 с количеством десятичных знаков, которое я укажу.

Мне нужно Float значение return not Double

.

Ответ 1

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

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

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

Ответ 2

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

Изменить: Example

Ответ 3

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

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

Результат будет roundfinalЦена → 5652.26

Ответ 4

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

В общем, не вызывайте конструкторы DecimalFormat напрямую, так как методы NumberFormat factory могут возвращать подклассы, отличные от 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));

Ответ 5

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

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

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

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

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

Ответ 6

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

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

Результат печати будет 12.35. Обратите внимание, что он будет вокруг вас для вас.

Ответ 7

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

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;
}

Ответ 8

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

return value.toString();

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

value.floatValue();

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

Ответ 9

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();
    }