将大十进制值舍入为 2 位小数

2022-08-31 14:21:17

我想要一个函数来转换Bigdecimal和.但是没有一个函数可以同时满足这两个转换。请帮助实现这一目标。10.12 for 10.1234510.13 for 10.12556

以下是我尝试过的。
值为 10.12345:

BigDecimal a = new BigDecimal("10.12345");

a.setScale(2, BigDecimal.ROUND_UP)
a.setScale(2, BigDecimal.ROUND_CEILING)
a.setScale(2, BigDecimal.ROUND_DOWN)
a.setScale(2, BigDecimal.ROUND_FLOOR)
a.setScale(2, BigDecimal.ROUND_HALF_DOWN)
a.setScale(2, BigDecimal.ROUND_HALF_EVEN)
a.setScale(2, BigDecimal.ROUND_HALF_UP)

输出:

10.12345::10.13
10.12345::10.13
10.12345::10.12
10.12345::10.12
10.12345::10.12
10.12345::10.12
10.12345::10.12

值为 10.12556:

BigDecimal b = new BigDecimal("10.12556");

b.setScale(2, BigDecimal.ROUND_UP)
b.setScale(2, BigDecimal.ROUND_CEILING)
b.setScale(2, BigDecimal.ROUND_DOWN)
b.setScale(2, BigDecimal.ROUND_FLOOR)
b.setScale(2, BigDecimal.ROUND_HALF_DOWN)
b.setScale(2, BigDecimal.ROUND_HALF_EVEN)
b.setScale(2, BigDecimal.ROUND_HALF_UP)

输出:

10.12556::10.13
10.12556::10.13
10.12556::10.12
10.12556::10.12
10.12556::10.12
10.12556::10.12
10.12556::10.12

答案 1

我认为您正在寻找的是.来自 javadocRoundingModeROUND_HALF_EVEN

舍入模式以舍入为“最近邻”,除非两个相邻项都等距,在这种情况下,舍入为偶数邻点。如果丢弃分数左侧的数字是奇数,则表现为ROUND_HALF_UP;表现得像ROUND_HALF_DOWN,如果它是均匀的。请注意,这是舍入模式,可在对一系列计算重复应用时最大程度地减少累积误差。

下面是一个快速测试用例:

BigDecimal a = new BigDecimal("10.12345");
BigDecimal b = new BigDecimal("10.12556");

a = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
b = b.setScale(2, BigDecimal.ROUND_HALF_EVEN);

System.out.println(a);
System.out.println(b);

正确打印:

10.12
10.13

更新:

setScale(int, int)自 Java 1.5 以来一直不推荐使用枚举,当时枚举首次被引入,并最终在 Java 9 中被弃用。您现在应该使用例如:setScale(int, RoundingMode)

setScale(2, RoundingMode.HALF_EVEN)


答案 2

首先添加到号码,然后呼叫0.001setScale(2, RoundingMode.ROUND_HALF_UP)

代码示例:

public static void main(String[] args) {
    BigDecimal a = new BigDecimal("10.12445").add(new BigDecimal("0.001"));
    BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP);
    System.out.println(b);
}

推荐