将浮点数格式化为 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 位小数的主要内容,如果未能解决你的问题,请参考以下文章