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

33 浏览
0 Comments

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

我想要的是一种将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中实现这个最好的方法是什么?

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

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

这是针对5位精度的,0的数量表示小数位数。

0
0 Comments

使用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;

要向下取整,需要减去相应的精度。

0