【问题标题】:BigDecimal round to 0 or 5BigDecimal 舍入为 0 或 5
【发布时间】:2014-02-19 17:05:53
【问题描述】:

我正在修改 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));
}

【问题讨论】:

    标签: android rounding bigdecimal


    【解决方案1】:

    您可以乘以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
    

    【讨论】:

    • 永远不要使用new BigDecimal(65.99),而是new BigDecimal("65.99")。双精度数是一个近似值,是 2 的(负)幂的总和。对于字符串,精度以 BigDecimal 闻名。
    • 这是一个很好的解决方案,而且它提供了合理的值。谢谢你。 @JoopEggen 谢谢你的提示,这实际上为我节省了一些周期,因为我正在解析浮动然后创建一个 BigDecimal,现在我可以传入字符串。
    【解决方案2】:
        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
    • 使用给定的 RoundingMode (UP) 对该值进行四舍五入,得到的值为 65

    您可能需要设置比例而不是精度:

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

    【讨论】:

      【解决方案3】:

      您要查找的函数是 setScale,它是 BigDecimal 的一部分。

      这是对同一问题的一个很好的答案: Java BigDecimal: Round to the nearest whole value

      【讨论】:

        猜你喜欢
        • 2014-01-22
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多