我想要的是一个将双数转换为字符串的方法,该方法使用半升法进行四舍五入--即如果要四舍五入的小数是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
编辑:。原来的答案没有解决双倍值的准确性问题。如果你不太关心它是向上还是向下取整,那就没问题。但是如果你想要精确的四舍五入,那么你就需要考虑到数值的预期精度。浮点值在内部有一个二进制表示。这意味着像2.77395这样的值实际上在内部并没有这个精确的值。它可能略大或略小。如果内部值稍小,那么它就不会四舍五入到2.7740。为了补救这种情况,你需要意识到你所处理的数值的准确性,并在四舍五入之前加上或减去该数值。例如,当你知道你的数值精确到6位时,那么要将一半的数值四舍五入,就要将这个精度加到数值上。
Double d = n.doubleValue() + 1e-6;
如果要向下四舍五入,则要减去该精度。