Відформатуйте "Плаваючий" до п яти знаків після коми


220

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

Ви також можете передавати значення float та використовувати:

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

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


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

6
ця відповідь дає значення String, а не значення Float, я не вважаю гарною відповіддю.
ЧжаоГан

3
Чому б ви примусили крапку як роздільник?
Марк Буйкема

1
@MarkBuikema Я думаю, що є випадки, коли це було б абсолютно необхідно, наприклад, при складанні форматів документів, керованих стандартами, наприклад. PDF документи.
Тярт

39

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

Правка : Приклад


1
+1. Ось документація для Android , яка по суті повинна бути однаковою.
Za L L

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

Ти кажеш, що хочеш круглити поплавок? Зазвичай єдиний час точності поплавця має значення для показу.
Нік Кемпіон

Вибачте, ви маєте рацію, я розгубився, просто відформатуйте номер, коли він відображався на екрані, а не раніше, це було моїм питанням, дуже дякую, проблема вирішена.
seba123neo

Зверніть увагу, використання DecimalFormatконструктора не рекомендується, дивіться мою відповідь щодо правильного використання NumberFormat.
ФББ

17

Спробуйте це мені дуже допомогло

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

Результат буде круглим. Ціна -> 5652,26


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

Це працює і з GWT. String.format () - ні.
AlexV

15

Зверніть увагу, використання DecimalFormatконструктора не рекомендується. Явадок для цього класу говорить:

Як правило, не викликайте конструкторів 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: так, тому що тут ми вказуємо, що нам потрібно дві цифри після коми, і робити округлення вгору. У цьому випадку 8.499 округлюється до 8.5. Якщо ви хочете, щоб 8.499 було відображено, просто встановіть 3 як максимум цифр дробу.
ФББ

6

Ось короткий зразок використання DecimalFormatкласу, згаданого Ніком.

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

Вихід заяви про друк складе 12,35. Зауважте, що це окружить це вам.


Зверніть увагу, використання DecimalFormatконструктора не рекомендується, дивіться мою відповідь щодо правильного використання NumberFormat.
ФББ

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це занадто дорога операція, яку слід використовувати для округлення?
Ксерус

Ніколи не оптимізуйте, поки у вас фактично не виникне проблема з продуктивністю. Важливіше бути правильним, ніж швидким. І я не можу чесно уявити додаток, де виконання контрольованого округлення було б проблемою, якщо б ви не Visa або Mastercard (хто просто кинув би більше машин на нього). І pow (), мабуть, швидше, ніж круглий ().
Робін Девіс

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));
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.