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

标签 java decimal rounding digits

我想要的是一种将 double 转换为字符串的方法,该字符串使用 half-up 方法四舍五入 - 即,如果要四舍五入的小数是 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/45895880/

相关文章:

java - 如何在spring data jpa查询中指定@lock超时?

java - 在 Java 中如何将任何整数四舍五入到下一个最高的一百位?

javascript - 在 JavaScript 中四舍五入到最接近的小数点后的百分之一

go - 为什么Go编程将以零开头的任何数字都视为八进制,如何防止这种情况发生?

python - MySQL数据库更新到小数点

c# - 移动到圆形区域,然后捕捉到网格?

java - 数学轮java

java - 消息未使用 Jboss 主题重新传送

java - 基本安卓: how to handle isPressed action on a button in Android

java - 由于方法大小过大,无法对 jprofiler 进行检测