为什么 BigDecimal 比例在 Java 中不起作用?

Why BigDecimal scale not working in Java?

我用 BigDecimal 花了好几个小时才得到正确的结果。

我有号码 7.7049。我想第一轮到 3 位数。我会得到 7.705。然后再四舍五入到 2 位数。我应该得到 7.71。

我试过这个:

BigDecimal(result).setScale(2, RoundingMode.HALF_UP) //instead of 2 can be any other number

但是我得到了错误的号码:7.70

我尝试过不同的模式。我也试过 valueOf(result.toDouble()) 但没有任何效果。 这里的问题看起来像 setScale. 之后只处理最后 2 个数字并忽略其他数字。

我该如何解决这个问题?

更新:

更多示例:

7.7019 必须是 7.70 | 7.7052 必须是 7.71 | 7.7071 必须是 7.71 | 7.7030 必须是 7.70

可以先四舍五入前三位,再四舍五入前两位即可。

BigDecimal a = new BigDecimal("7.7039")
    .setScale(3, RoundingMode.HALF_UP)
    .setScale(2, RoundingMode.HALF_UP);

结果与您的测试用例兼容。我还没有对负数进行测试,对于任意精度的数字,它可能不会产生预期的结果。

您可以参考 the docs on RoundingMode 并使用这个想法也许可以想出一个以您想要的非标准方式舍入数字的方案。

The problem is simple. I have the number 7.7049. When I want to round to 3 digits after . I will get 7.705 but when I'll round this more, to 2 digits I should see 7.71.

您已经提到了您需要做的事情,即先用 3 的比例进行舍入,然后用 2 的比例进行舍入。

演示:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Main {
    public static void main(String[] args) {
        System.out.println(roundNumber(7.7019, 3, 2));
        System.out.println(roundNumber(7.7052, 3, 2));
        System.out.println(roundNumber(7.7071, 3, 2));
        System.out.println(roundNumber(7.7030, 3, 2));
        System.out.println(roundNumber(7.7049, 3, 2));
        System.out.println(roundNumber(7.7039, 3, 2));
    }

    static BigDecimal roundNumber(double num, int scaleRound1, int scaleRound2) {
        return new BigDecimal(num).setScale(scaleRound1, RoundingMode.HALF_UP).setScale(scaleRound2,
                RoundingMode.HALF_UP);
    }
}

输出:

7.70
7.71
7.71
7.70
7.71
7.70