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

мне нужно отформатировать поплавок до " 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

.

10 ответов


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

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

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


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

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


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

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

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


Примечание, использование 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));

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

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

выход инструкции печати будет 12.35. Обратите внимание,что он будет вокруг вас.


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

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

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

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

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


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

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

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

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

return value.toString();

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

value.floatValue();

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


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

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