BigDecimal.setScale(int, int) 和 RoundingMode 枚举的弃用构造函数

Deprecated constructor for BigDecimal.setScale(int, int) and RoundingMode enums

我正在尝试使用以下内容指定 BigDecimal 值的精度:new BigDecimal(12.99).setScale(2, BigDecimal.ROUND_HALF_EVEN。但是,编译器告诉我 setScale(int, int) 已弃用。

当我尝试使用 RoundingMode 枚举时,它告诉我枚举可能尚未初始化。如何正确使用枚举来实例化 BigDecimals setScale(int, RoundingMode)?

谢谢!

你不应该 "instantiate" 一个枚举,而是使用它的常量。你试过了吗:

new BigDecimal(12.99).setScale(2, RoundingMode.HALF_EVEN);

请注意,您还可以使用字符串构造函数:

new BigDecimal("12.99");

根据文档,setScale(int, int)Java 1.5 首次引入枚举后就不再被推荐:

The new setScale(int, RoundingMode) method should be used in preference to this legacy method.

最终在 Java 9 中弃用了它。

您应该改为调用 setScale(2, RoundingMode.HALF_EVEN)。它使错误检查变得更加简单,因为您不能传入未定义的 enum,但您当然可以传入未定义的整数模式。

其他答案提供了有关舍入模式的良好指导 - 但在某种程度上他们错过了另一个关键点。来自 javadoc:

The results of this constructor can be somewhat unpredictable.

重点是:当您传递一个 double 值时,浮点数 语义就会启动。

换句话说:您打算使用特殊的、昂贵的 "overhead" 对象来处理任意浮点数。但是你通过将它基于一个仅限于 Java 双语义的值来开始这件事。

改为 new BigDecimal("12.99"),或 new BigDecimal(1299, 2)