协慌网

登录 贡献 社区

如何在 Java 中将数字舍入到 n 个小数位

我想要的是一种将 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

假设valuedouble ,你可以这样做:

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

这是 5 位精度。零的数量表示小数位数。

new BigDecimal(String.valueOf(double)).setScale(yourScale, BigDecimal.ROUND_HALF_UP);

会得到一个BigDecimal 。要从中获取字符串,只需调用BigDecimaltoString方法,或者toPlainString Java 5 + 的toPlainString方法作为纯格式字符串。

示例程序:

package trials;
import java.math.BigDecimal;

public class Trials {

    public static void main(String[] args) {
        int yourScale = 10;
        System.out.println(BigDecimal.valueOf(0.42344534534553453453-0.42324534524553453453).setScale(yourScale, BigDecimal.ROUND_HALF_UP));
    }