如何在Java中将数字四舍五入到小数点后n位 | Java Debug 笔记

本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看<活动链接>

问题

我想要的是一种将双精度数转换为使用 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 显式设置为 Half-up 处理您的问题,然后进行格式化的输出。

例子:

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;
复制代码

要四舍五入,请减去精度。

翻译内容来源Stack Overflow:stackoverflow.com/questions/1…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享