使用DecimalFormat获取不同位数的小数位数。

6

我想使用Decimal Format类来对数字进行四舍五入:

double value = 10.555;

DecimalFormat fmt = new DecimalFormat ("0.##");

System.out.println(fmt.format(value));

在这里,变量value会保留两位小数,因为有两个#。然而,我想将value保留到一个未知的小数位数,由另外一个称为numPlaces的整数指示。是否有一种方法可以使用十进制格式化程序来完成这个任务?
例如,如果numPlaces = 3并且value = 10.555,则需要将value四舍五入到三个小数位。

你是否决定使用DecimalFormat?因为如果你使用Formatter,会更容易一些。 - Dawood ibn Kareem
为什么你取消了我的答案并接受了他的?他在我发布答案后抄袭了我的回答... - Michael Yaworski
你编辑了你的回答。 - Evan
好的,如果这样能让你开心,那我就将你的答案标记为正确的... - Evan
1
@RealMadrid_CF 謝謝。他的回答和我的一樣。我後來加入了最後一部分,但他抄袭了我的解决问题的方式(使用 for 循环添加“#”)。他的答案和我的唯一不同之处是,他將我的代碼從方法中刪除了。 - Michael Yaworski
显示剩余2条评论
4个回答

7
创建一个方法,将特定数量的 # 添加到字符串中,例如:
public static String generateNumberSigns(int n) {

    String s = "";
    for (int i = 0; i < n; i++) {
        s += "#";
    }
    return s;
}

然后使用该方法生成一个字符串传递给 DecimalFormat 类:

double value = 1234.567890;
int numPlaces = 5;

String numberSigns = generateNumberSigns(numPlaces);
DecimalFormat fmt = new DecimalFormat ("0." + numberSigns);

System.out.println(fmt.format(value));

或者干脆一次性全部完成而不需要方法:

double value = 1234.567890;
int numPlaces = 5;

String numberSigns = "";
for (int i = 0; i < numPlaces; i++) {
    numberSigns += "#";
}

DecimalFormat fmt = new DecimalFormat ("0." + numberSigns);

System.out.println(fmt.format(value));

我是否可以只添加 DecimalFormat fmt = new DecimalFormat ("0." + numberSigns);,而不必添加字符串方法? - Evan
@RealMadrid_CF:当然可以。您可以将代码从方法中移动到使用“DecimalFormat”的任何位置。该方法只是一种生成特定数量的“#”的方式,但如果您想要,可以用另一种方式完成它。但是,方法是良好的实践,并且可以在代码、类等多个部分中重复使用。 - Michael Yaworski

5

如果您不需要 DecimalFormat 用于其他目的,更简单的解决方法是使用 String.formatPrintStream.format,并以类似 Mike Yaworski 的解决方案方式生成格式字符串。

int precision = 4; // example
String formatString = "%." + precision + "f";
double value = 7.45834975; // example
System.out.format(formatString, value); // output = 7.4583

你救了我的一天,谢谢你。之前我在Kotlin中使用RoundingMode.CEILING和decimalFormat,这个方法很好用,但有时会返回例如7123,12的结果,而我想要的是7123.12。通过使用这个方法,我得到了解决方案。 - Eddie Brock

2
这个怎么样?
double value = 10.5555123412341;
int numPlaces = 5;
String format = "0.";

for (int i = 0; i < numPlaces; i++){
    format+="#";
}
DecimalFormat fmt = new DecimalFormat(format);

System.out.println(fmt.format(value));

无论如何,显然在发布你的答案之前你已经阅读了我的(你使用了与我相同数量的小数位)。我不认为你直接抄袭了我;我只是想表达的是我先发布了一个更完整的解决方案。他声称我抄袭了你,所以我扭转了局面。既然问题解决了,我现在已经给你的答案点赞了。我还删除了你帖子中发给我的信息。谢谢并道歉。 - Michael Yaworski
实际上,我没有机会阅读你的内容。就在我发布后,Stack Overflow说有人比我早一分钟发布了。但我还是发了。由于示例中的数字大多由5组成,所以我决定将小数位设置为5。 - Don

-2
如果您不一定要使用DecimalFormat,您可以结合所需精度的MathContext,使用BigDecimal.round(),然后只需使用BigDecimal.toString()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接