Ответ 1
Вы также можете передать значение float и использовать:
String.format("%.2f", floatValue);
Мне нужно отформатировать 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
.
Вы также можете передать значение float и использовать:
String.format("%.2f", floatValue);
Посмотрите DecimalFormat. Вы можете легко использовать его, чтобы взять число и дать ему заданное количество знаков после запятой.
Изменить: Example
Попробуйте, это очень помогло мне.
BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);
Результат будет roundfinalЦена → 5652.26
Следует отметить, что использование конструктора 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));
Своего удивления никто не указал на прямой способ сделать это, что достаточно просто.
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 будут делать половину округления, но они выполняют двоичное полукругление, а не десятичное полукругление. Итак, вы, вероятно, хорошо
Здесь приведен пример с использованием класса DecimalFormat
, упомянутого Ником.
float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));
Результат печати будет 12.35. Обратите внимание, что он будет вокруг вас для вас.
Это гораздо менее профессиональный и гораздо более дорогой способ, но его должно быть легче понять и более полезно для начинающих.
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, потому что в основном используется для вычисления чего-либо.
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();
}