java - Java中如何将数字四舍五入到小数点后n位

标签 java decimal rounding digits

我想要一种将 double 转换为字符串的方法,该字符串使用半向上方法舍入 - 即,如果要舍入的小数是 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 中实现这一目标的最佳方法是什么?

最佳答案

使用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
<小时/>

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

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

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

关于java - Java中如何将数字四舍五入到小数点后n位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58530975/

相关文章:

java - 在 Spring 中,如何将自定义参数自动填充到 web @Controller 方法?

c# - 使用带小数的指数

html - 对齐表格中数字的小数点,在单元格中出现伪 -"centre"对齐

c# - 在多人之间分配美元金额的舍入问题

javascript - 将特定 Excel 公式转换为 Javascript

python - 将 float 限制为两位小数

java - 将 Map 作为用户定义的基础

Java : how to replace my last char in a string

java - 看不懂 Java 补码

c++ - strtol 对两个不同的十六进制字符串给出相同的答案