将Float格式化为n个小数位


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

Answers:


561

您还可以传递float值,并使用:

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

文献资料


70
请谨慎操作,因为String.format取决于您当前的本地配置,您可能不会得到一个点作为分隔符。建议使用String.format(java.util.Locale.US,"%.2f", floatValue);
Gomino

6
这个答案给出的是String值,而不是Float值,我认为这不是一个好答案。
赵刚

3
为什么要强制使用点作为分隔符?
Mark Buikema

1
@MarkBuikema我认为在某些情况下绝对必要,例如在编译由标准驱动的文档格式时。PDF文件。
Tjaart

39

看一下DecimalFormat。您可以轻松地使用它来取一个数字并为其设置一个固定的小数位数。

编辑示例


1
+1。这是特定Android的文档,应该基本相同。
Zach L

但我需要的结果是浮点数,而不是字符串。
seba123neo 2011年

您是说要对彩车进行四舍五入吗?通常,浮点数的唯一时间精度是用于显示。
尼克·坎皮恩

抱歉,您是对的,我很困惑,只是在显示屏幕时格式化数字,而不是之前,这是我的问题,非常感谢,问题已解决。
seba123neo 2011年

值得注意的DecimalFormat是,不鼓励使用构造函数,请参阅我的答案以正确使用NumberFormat
FBB

17

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

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

结果将是roundfinalPrice-> 5652.26


2
这对于希望进行四舍五入并进行一些进一步计算的人很有用,否则,Arve的答案可能是最好的。
杰拉德

这也适用于GWT。String.format()-否。
AlexV

15

值得注意的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));

当(例如)floatValue = 8.499时,此方法不起作用。它给出8.5。
希瓦·克里希纳·奇帕

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

6

这是使用DecimalFormatNick提到的类的快速示例。

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

打印语句的输出为12.35。请注意,它将为您取整。


值得注意的DecimalFormat是,不鼓励使用构造函数,请参阅我的答案以正确使用NumberFormat
FBB

5

Kinda感到惊讶的是,没有人指出这样做的直接方法,这很容易。

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使用四舍五入法过于昂贵吗?
Xerus

在您实际遇到性能问题之前,请不要进行优化。做对比做快速重要。而且,我无法诚实地想象一个应用程序中的受控舍入性能会成为问题,除非您是Visa或Mastercard(他们会向其中扔更多的机器)。而且pow()可能比round()更快。
罗宾·戴维斯

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 2011年

2
如果需要浮点数来显示给用户,则应用程序的设计可能存在问题。通常,浮点数用于计算,而字符串则用于向用户显示。
n3utrino 2011年

抱歉,您是对的,我很困惑,只是在显示屏幕时格式化数字,而不是之前,这是我的问题,非常感谢,问题已解决。
seba123neo 2011年

1

我一直在寻找这个问题的答案,后来我开发了一种方法!:)一个公平的警告,它是在舍弃价值。

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.