如何在Java中将数字四舍五入到n位小数

新手上路,请多包涵

我想要的是一种将双精度数转换为使用半数方法四舍五入的字符串的方法 - 即,如果要四舍五入的小数是 5,它总是向上舍入到下一个数字。这是大多数人在大多数情况下所期望的标准舍入方法。

我也希望只显示有效数字 - 即不应该有任何尾随零。

我知道这样做的一种方法是使用 String.format 方法:

 String.format("%.5g%n", 0.912385);

返回:

 0.91239

这很好,但是它总是显示带有 5 位小数的数字,即使它们不重要:

 String.format("%.5g%n", 0.912300);

返回:

 0.91230

另一种方法是使用 DecimalFormatter

 DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

返回:

 0.91238

但是,如您所见,这使用了半偶数舍入。也就是说,如果前一个数字是偶数,它将向下舍入。我想要的是这样的:

 0.912385 -> 0.91239
0.912300 -> 0.9123

在 Java 中实现这一目标的最佳方法是什么?

原文由 Alex Spurling 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 683
2 个回答

使用 setRoundingMode ,明确设置 RoundingMode 来处理半偶数轮的问题,然后使用格式模式进行所需的输出。

例子:

 DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
    Double d = n.doubleValue();
    System.out.println(df.format(d));
}

给出输出:

 12
123.1235
0.23
0.1
2341234.2125


编辑:原始答案没有解决双精度值的准确性。如果您不太关心它是向上还是向下舍入,那很好。但是,如果您想要精确的舍入,则需要考虑值的预期准确性。浮点值在内部具有二进制表示。这意味着像 2.7735 这样的值实际上在内部并不具有确切的值。它可以稍大或稍小。如果内部值稍小,则不会向上舍入到 2.7740。为了纠正这种情况,您需要了解您正在使用的值的准确性,并在四舍五入之前添加或减去该值。例如,当您知道您的值精确到 6 位时,然后将中间值向上舍入,将该精度添加到值中:

 Double d = n.doubleValue() + 1e-6;

要向下舍入,请减去准确度。

原文由 curtisk 发布,翻译遵循 CC BY-SA 4.0 许可协议

假设 value 是一个 double ,你可以这样做:

 (double)Math.round(value * 100000d) / 100000d

这是 5 位数的精度。零的个数表示小数位数。

原文由 asterite 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题