将浮点数格式化为 n 位小数

Posted

技术标签:

【中文标题】将浮点数格式化为 n 位小数【英文标题】:Format Float to n decimal places 【发布时间】:2011-07-08 22:12:57 【问题描述】:

我需要将浮点数格式化为“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

.

【问题讨论】:

【参考方案1】:

看看DecimalFormat。您可以轻松地使用它来获取一个数字并为其指定小数位数。

编辑:Example

【讨论】:

+1。这里是android-specific documentation,应该基本一样。 但我需要结果是浮点数,而不是字符串。 你是说你想把浮点数四舍五入吗?通常情况下,浮点数的唯一时间精度是用于显示。 对不起,你是对的,我很困惑,只是在屏幕上显示数字时格式化,而不是以前,这是我的问题,非常感谢,问题解决了。 请注意,不鼓励使用DecimalFormat 构造函数,请参阅我的答案以正确使用NumberFormat【参考方案2】:

我想你想要什么

return value.toString();

并使用返回值显示。

value.floatValue();

将始终返回 625.3,因为它主要用于计算。

【讨论】:

但我需要结果是浮点数,而不是字符串。 如果你需要一个浮动来向用户展示它,那么应用程序的设计可能有问题。通常使用浮点数进行计算,并使用字符串显示给用户。 对不起,你是对的,我很困惑,只是格式化屏幕上显示的数字,而不是以前,这是我的问题,非常感谢,问题解决了。【参考方案3】:

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

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

Documentation

【讨论】:

请注意 String.format 取决于您当前的本地配置,您可能不会得到一个点作为分隔符。更喜欢使用String.format(java.util.Locale.US,"%.2f", floatValue); 这个答案给出了一个字符串值,而不是一个浮点值,我认为不是一个好的答案。 为什么要强制使用点作为分隔符? @MarkBuikema 我认为在某些情况下这是绝对必要的,例如在编译由标准驱动的文档格式时,例如。 PDF 文档。【参考方案4】:

试试这个对我有很大帮助

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

结果将是 roundfinalPrice --> 5652.26

【讨论】:

这对于那些希望对其进行四舍五入并进行进一步计算的人更有用,否则,Arve 的答案可能是最好的。 这也适用于 GWT。 String.format() - 没有。【参考方案5】:

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

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这个操作太贵了,不适合四舍五入? 在真正遇到性能问题之前永远不要优化。正确比快速更重要。老实说,我无法想象受控舍入的性能会成为问题的应用程序,除非您是 Visa 或 Mastercard(他们只会扔更多机器)。而且 pow() 可能比 round() 更快。【参考方案6】:
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();
    

【讨论】:

【参考方案7】:

这是一个使用 Nick 提到的 DecimalFormat 类的快速示例。

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

打印语句的输出将是 12.35。请注意,它会为您四舍五入。

【讨论】:

请注意,不鼓励使用DecimalFormat 构造函数,请参阅我的答案以正确使用NumberFormat【参考方案8】:

值得注意的是,不鼓励使用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。 @ShivakrishnaChippa:是的,因为在这里我们指定我们想要逗号后面的 2 位数字,并进行向上舍入。在这种情况下,8.499 舍入为 8.5。如果要显示 8.499,只需将 3 设置为最大小数位数。【参考方案9】:

这是一种不太专业且成本更高的方法,但它应该更容易理解并且对初学者更有帮助。

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;

【讨论】:

【参考方案10】:

我一直在寻找这个问题的答案,后来我开发了一种方法! :) 一个公平的警告,它正在对值进行四舍五入。

private float limitDigits(float number) 
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));

【讨论】:

【参考方案11】:

如果要将数字格式化为字符串,可以使用十进制格式,例如:

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

这段代码的输出将是:

123455.0

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

【讨论】:

DecimalFormat#format 采用双精度,使格式化的浮点数超过浮点数可以容纳的位数。

以上是关于将浮点数格式化为 n 位小数的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数与字符串连接并舍入到小数点后 2 位

当 .toFixed(2) 小数点后为零时,如何将浮点数格式化为整数?

如何将浮点数打印到 n 位小数,包括尾随 0?

将浮点数舍入到 N 个小数位

如何在 Python 中将浮点数格式化为固定宽度

如何在没有不必要的十进制 0 的情况下很好地将浮点数格式化为字符串