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)
。
我正在尝试使用以下内容指定 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)
。