四舍五入到最接近的千分之一

Rounding to the nearest hundered-thousandths

我在尝试将数字中的小数位四舍五入到最接近的千位时遇到问题。

示例:

BigDecimal num1 = BigDecimal.valueOf(0.38871551);
MathContext mc = new MathContext(5);
System.out.println(num1.round(mc));

输出是 0.38872,符合预期。到目前为止一切都很好。再举个例子:

BigDecimal num1 = BigDecimal.valueOf(1.1680418);
MathContext mc = new MathContext(5);
System.out.println(num1.round(mc));

输出为1.1680。这就是问题所在。我想要的是输出 1.16804 但四舍五入似乎吃掉了 4 而不是保持原样。

我尝试了不同的舍入模式,但这是我得到的:

如何获得所需的输出:

我什至尝试四舍五入到小数点后第 6 位而不是小数点后第 5 位,但我无法找到能给我所需输出的正确组合,如上所示。

你可以这样试试

DecimalFormat df = new DecimalFormat("#.00000");

System.out.print(df.format(1.1680418)); //1.16804

你可以试试BigDecimal的setScale函数

num1 = num1.setScale(5, BigDecimal.ROUND_HALF_UP);

MathContext(int) 将数字四舍五入到该位数,将整个数字考虑在内,而不仅仅是逗号后的数字。

假设您使用这些数字:

    BigDecimal ten = BigDecimal.valueOf(10.55052984);

    MathContext five = new MathContext(5);
    MathContext two = new MathContext(2);

    System.out.println(ten.round(five));
    System.out.println(ten.round(two));

无论位置如何,它都会生成一个四舍五入到第 5 位或第 2 位的数字:

10.551
11

这应该有效:

    BigDecimal num1 = BigDecimal.valueOf(0.38871551);
    System.out.println(num1.setScale(5, RoundingMode.HALF_UP));

    num1 = BigDecimal.valueOf(1.1680418);
    System.out.println(num1.setScale(5, RoundingMode.HALF_UP));

    num1 = BigDecimal.valueOf(0.55052984);
    System.out.println(num1.setScale(5, RoundingMode.HALF_UP));

0.38872
1.16804
0.55053