将Float格式化为n个小数位

seb*_*neo 216 java format floating-point android numbers

我需要将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
}
Run Code Online (Sandbox Code Playgroud)

我需要返回一个浮点值,其中包含我指定的小数位数.

我不需要Float价值回报Double

.

Arv*_*rve 551

您也可以传递浮点值,并使用:

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

文档

  • 请小心,因为String.format取决于您当前的本地配置,您可能不会得到一个点作为分隔符.首选使用`String.format(java.util.Locale.US,"%.2f",floatValue);` (69认同)
  • 这个答案给出了一个String值,而不是Float值,我认为不是一个好的答案. (6认同)
  • 为什么要强制点作为分隔符? (3认同)

Nic*_*ion 39

看看DecimalFormat.您可以轻松地使用它来取一个数字并给它一组小数位.

编辑:示例


Anu*_*pam 16

试试这个对我帮助很大

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);
Run Code Online (Sandbox Code Playgroud)

结果将是圆形的价格 - > 5652.26

  • 这对于那些想要进行回合并用它进行一些进一步计算的人来说更有用,否则,Arve的回答可能是最好的. (2认同)

FBB*_*FBB 14

值得注意的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));
Run Code Online (Sandbox Code Playgroud)

  • @ShivakrishnaChippa:是的,因为这里我们指定要在逗号后两位,然后进行四舍五入。在这种情况下,8.499会四舍五入到8.5。如果要显示8.499,只需将3设置为最大分数位数。 (2认同)

Ton*_* L. 6

这是使用DecimalFormatNick提到的课程的快速示例.

float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));
Run Code Online (Sandbox Code Playgroud)

print语句的输出为12.35.请注意,它将为您舍入它.


Rob*_*ies 5

有点惊讶没有人指出直接的方法,这很容易。

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

很确定这不会做半偶舍入。

就其价值而言,当您将基于二进制的浮点值与基数为 10 的算术混合时,半偶数舍入将变得混乱且不可预测。我很确定这是做不到的。基本问题是像 1.105 这样的值不能用浮点数精确表示。浮点值将类​​似于 1.105000000000001 或 1.104999999999999。因此,任何执行半偶数舍入的尝试都会因表示编码错误而失败。

IEEE 浮点实现将进行半舍入,但它们进行二进制半舍入,而不是十进制半舍入。所以你可能没事