使用 2 个小数位舍入 Bigdecimal 值

新手上路,请多包涵

我想要一个函数来转换 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

原文由 sunleo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 415
2 个回答

我认为您正在寻找的 RoundingModeROUND_HALF_EVEN 。从 javadoc

舍入模式向“最近的邻居”舍入,除非两个邻居都是等距的,在这种情况下,向偶数邻居舍入。如果丢弃的分数左侧的数字是奇数,则与 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)

原文由 Florent Bayle 发布,翻译遵循 CC BY-SA 4.0 许可协议

先加 0.001 setScale(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);
}

原文由 Erwin Bolwidt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题