我需要格式化一个浮点数到小数点后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

.


当前回答

有点奇怪没有人指出直接的方法,这很简单。

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浮点实现会做半舍入,但他们做二进制半舍入,而不是十进制半舍入。所以你可能没事

其他回答

我想你想要的是

return value.toString();

并使用返回值进行显示。

value.floatValue();

将总是返回625.3,因为它主要用于计算一些东西。

这是一种不那么专业,也更昂贵的方式,但它应该更容易理解,对初学者更有帮助。

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

有点奇怪没有人指出直接的方法,这很简单。

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浮点实现会做半舍入,但他们做二进制半舍入,而不是十进制半舍入。所以你可能没事

如果您想将数字格式化为字符串,则可以使用Decimal格式,例如:

String a = "123455";
System.out.println(new 
DecimalFormat(".0").format(Float.valueOf(a)));

这段代码的输出将是:

123455.0

您可以在十进制格式中添加更多的零,这取决于您想要的输出。

试试这个,这对我帮助很大

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

结果将是 roundfinalPrice—> 5652.26