大十进制舍入为 0 或 5



我正在修改Android中的BigDecimal和货币格式,并且想知道是否可以使用BigDecimal执行以下操作:

我的愿望:

  64.99 --> 65.00 (Rounded Up)
  64.99 --> 60.00 (Rounded Down)
  65.01 --> 70.00 (Rounded Up)
  65.01 --> 65.00 (Rounded Down)

目前,使用下面的代码,我只能四舍五入为零。例如:

我得到什么:

  64.99 --> 70.00 (Rounded Up)
  64.99 --> 60.00 (Rounded Down)
  65.01 --> 70.00 (Rounded Up)
  65.01 --> 60.00 (Rounded Down)

有没有办法使用BigDecimal来实现我的愿望?

我的代码:

private static void printRoundedValues() {
    NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
    BigDecimal valueUp = new BigDecimal(64.50, new MathContext(1,RoundingMode.UP));
    BigDecimal valueDown = new BigDecimal(64.50, new MathContext(1,RoundingMode.DOWN)); 
    System.out.println("Value Up: " +  currencyFormat.format(valueUp));
    System.out.println("Value Down: " +  currencyFormat.format(valueDown));
}

你可以乘以 2 ,然后四舍五入到最接近的10,然后除以 2 。 这些BigDecimals的精度2;对于不同规模的BigDecimals,可能需要有所不同。

BigDecimal[] bds = {new BigDecimal("64.99"), new BigDecimal("65.01")};
BigDecimal two = new BigDecimal("2");
MathContext mcUp = new MathContext(2, RoundingMode.UP);
MathContext mcDown = new MathContext(2, RoundingMode.DOWN);
NumberFormat currency = NumberFormat.getCurrencyInstance();
for (BigDecimal bd : bds)
{
    System.out.println("Test: " + bd);
    BigDecimal roundUp5 = bd.multiply(two).round(mcUp).divide(two);
    System.out.println("Round up: " + currency.format(roundUp5));
    BigDecimal roundDown5 = bd.multiply(two).round(mcDown).divide(two);
    System.out.println("Round down: " + currency.format(roundDown5));
}

输出:

Test: 64.99
Round up: $65.00
Round down: $60.00
Test: 65.01
Round up: $70.00
Round down: $65.00
    NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
    BigDecimal valueUp = new BigDecimal(64.50, new MathContext(2, RoundingMode.UP));
    BigDecimal valueDown = new BigDecimal(64.50, new MathContext(2, RoundingMode.DOWN));
    System.out.println("Value Up: " +  currencyFormat.format(valueUp));
    System.out.println("Value Down: " +  currencyFormat.format(valueDown));

以下是MathContext精度的工作原理:

  • 创建一个值 (64.5)
  • 将精度设置为给定值 (2),结果为 64.5
  • 使用给定的舍入模式 (UP) 将此值舍入,该值为 65

您可能需要设置小数位数而不是精度:

    BigDecimal valueUp = new BigDecimal(64.50).setScale(0, RoundingMode.UP);
    BigDecimal valueDown = new BigDecimal(64.50).setScale(0, RoundingMode.DOWN);

您正在寻找的函数是setScale,并且是BigDecimal的一部分。

这是对同一问题的良好回答:Java BigDecimal:舍入到最接近的整数值

最新更新