【问题标题】:How to round up 1.4549999999999998 using BigDecimal ROUND_HALF_UP?如何使用 BigDecimal ROUND_HALF_UP 将 1.4549999999999998 舍入?
【发布时间】:2018-01-16 22:58:33
【问题描述】:

我需要将 1.4549999999999998 等数字四舍五入到 1.46。我正在用 Groovy 编写,有以下方法。

 def roundBigDecimal(bd_val, scale, roundingMode) {
     assert bd_val instanceof BigDecimal
     return new BigDecimal(bd_val).setScale(scale, roundingMode)
}

但是,当我尝试: roundBigDecimal(1.4549999999999998, 2, BigDecimal.ROUND_HALF_UP),我回到 1.45。

【问题讨论】:

  • 是的,你得到 1.45,因为 1.454999 低于 1.455,所以没有“一半”可以四舍五入。您可能想要 ROUND_UP。或者分两步进行:首先将比例设置为 3,得到 1.455,然后再次将其四舍五入到比例 2。

标签: groovy rounding bigdecimal


【解决方案1】:

来自BigDecimal docs

ROUND_HALF_UP

@Deprecated(since="9")

改用 RoundingMode.HALF_UP。

Java 9 开始不推荐使用该方法,解决方法是调用setScale(int, RoundingMode) 方法:

roundBigDecimal(1.4549999999999998, 2, RoundingMode.HALF_UP)

【讨论】:

  • 不,它应该返回 1.46,因为 1.455 舍入到 1.46
  • 你试过了吗?因为1.454999等。 小于“一半”,因此不会向上取整。尝试一下。在 Java 中:BigDecimal b = new BigDecimal("1.4549999999999998").setScale(2, RoundingMode.HALF_UP); 按我的预期打印为 1.45。舍入不是逐步缩放,而是直接缩放,并且 1.45499999 低于 1.455,因此在使用 HALF_UP 时不会四舍五入。
  • 换句话说:是的,1.455 舍入到 1.46,但 1.45499...8。不是!
  • 来自 JavaDoc "请注意,这是学校通常教授的舍入模式。"所以这是非常具有误导性的信息......我肯定没有被教导这种舍入行为:D
  • 但我在荷兰。所以 1.4546666 没有四舍五入,即使你可以将 1.4546666 舍入到 1.454667,然后是 1.45467、1.4547、1.455,最后是 1.46 等等。
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多