Формат 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 ответов
посмотри 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));
}