如何使用 BigDecimal ROUND_HALF_UP 向上舍入 1.4549999999999998?

问题描述 投票:0回答:2

我需要将 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。

groovy rounding bigdecimal
2个回答
1
投票

来自 BigDecimal 文档

ROUND_HALF_UP

@已弃用(自=“9”)

使用 RoundingMode.HALF_UP 代替。

此方法自 Java 9 起已弃用,解决方案是调用

setScale(int, RoundingMode)
方法:

roundBigDecimal(1.4549999999999998, 2, RoundingMode.HALF_UP)

0
投票

我会退一步: 每当你遇到这样的问题时,这都是一个信号,表明你在早期就已经失去了精度。 我强烈建议从根本上修复它,这样你就不会收到这样的数字。 例如。将 double 转换为字符串,然后转换为 BigDecimal,或者对这些值进行反序列化处理(如果它们在传输过程中仍然是精确的)。

如果你不关心的话,一些框架(例如 Jackson)只是将数字映射为双倍。您应该已经强制此类框架直接转向 BigDecimal。他们通常会提供开箱即用的一切,只需要关心即可。

© www.soinside.com 2019 - 2024. All rights reserved.