【问题标题】:Rounding to the nearest hundered-thousandths四舍五入到最接近的千分之一
【发布时间】:2018-10-25 08:02:54
【问题描述】:

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

例子:

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.UP1.1681
  • RoundingMode.HALF_UPRoundingMode.HALF_DOWN1.1680 等等..

如何获得所需的输出:

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

我什至尝试舍入到小数点后第 6 位而不是第 5 位,但我无法找到正确的组合来提供我想要的输出,如上所示。

【问题讨论】:

标签: java rounding bigdecimal


【解决方案1】:

你可以试试 BigDecimal 的 setScale 函数

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

【讨论】:

  • 这也有效。但是为什么 HALF_UP 而不是 HALF_EVEN 像其他答案一样?
  • HALF_UP 将数字四舍五入到下一个更高的数字,但 HALF_EVEN 尽管与 HALF_UP 相似,但在与两个数字等距时会四舍五入到最接近的偶数。请参阅文档docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html
  • 也将我的更改为 HALF_UP...但这完全取决于您的需要。无论如何,setscale(int, RoundingMode) 应该优先于 setscale(int, int)
【解决方案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

【讨论】:

  • 谢谢。这看起来很有希望。根据任何数字的数学舍入规则,这是否总是正确的?此外,我使用Mathcontextround 方法厌倦了这种方法。为什么当您使用setScale 时这会给出所需的输出,但当您使用roundMathContext 时却没有给出所需的输出?另外,为什么是HALF_EVEN 而不是HALF_UP
  • MathContext(5)simply 表示整数长度为 5 位。所以 10 到 99 之间的数字只会多三位。
  • @Ping 我现在已经为答案添加了解释。
【解决方案3】:

你可以试试这个方法

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

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

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多