我需要将 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。
来自 BigDecimal 文档:
ROUND_HALF_UP
@已弃用(自=“9”)
使用 RoundingMode.HALF_UP 代替。
此方法自 Java 9 起已弃用,解决方案是调用
setScale(int, RoundingMode)
方法:
roundBigDecimal(1.4549999999999998, 2, RoundingMode.HALF_UP)
我会退一步: 每当你遇到这样的问题时,这都是一个信号,表明你在早期就已经失去了精度。 我强烈建议从根本上修复它,这样你就不会收到这样的数字。 例如。将 double 转换为字符串,然后转换为 BigDecimal,或者对这些值进行反序列化处理(如果它们在传输过程中仍然是精确的)。
如果你不关心的话,一些框架(例如 Jackson)只是将数字映射为双倍。您应该已经强制此类框架直接转向 BigDecimal。他们通常会提供开箱即用的一切,只需要关心即可。