四舍五入至千分之一

时间:2018-10-25 08:02:54

标签: java rounding bigdecimal

在尝试将数字的小数点后一位四舍五入至千分之一时遇到了问题。

示例:

powershell_Core_6.1.0_x64        6.1.0
powershell_Core_6.1.0_x64_Path   C:\Program Files\PowerShell\6
powershell_Core_x64              6.1.0

输出为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给出RoundMode.UP
  • 1.1681RoundingMode.HALF_UP赋予RoundingMode.HALF_DOWN 等等。

如何获得所需的输出:

  • 1.1680应该四舍五入到0.38871551
  • 0.38872应该四舍五入到1.1680418
  • 1.16804应该四舍五入到0.55052984

我什至尝试舍入到小数点后第六位而不是第五位,但是我找不到合适的组合,从而获得所需的输出,如上所示。

3 个答案:

答案 0 :(得分:3)

您可以使用BigDecimal的setScale函数进行尝试

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以尝试这种方式

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

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