BigDecimal.setScale(int,int)和RoundingMode枚举的不推荐使用的构造函数

时间:2017-11-13 15:35:34

标签: java enums deprecated bigdecimal deprecation-warning

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

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

谢谢!

3 个答案:

答案 0 :(得分:5)

你不应该“实例化”一个枚举,而是使用它的常量。你试过了吗?

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

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

new BigDecimal("12.99");

答案 1 :(得分:5)

根据文档setScale(int, int),自Java 1.5以来,当首次引入枚举时,未建议使用setScale(int, RoundingMode)

  

应优先使用新的enum方法,而不是这种遗留方法。

最终在Java 9中弃用了它。

您应该拨打setScale(2, RoundingMode.HALF_EVEN)。它使错误检查变得更加简单,因为你无法传入未定义的bootstrap3,但你肯定可以传入一个未定义的整数模式。

答案 2 :(得分:2)

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

  

这个构造函数的结果可能有些不可预测。

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

换句话说:你打算使用一种特殊的,昂贵的"开销"用于处理任意浮点数的对象。但是你可以将它基于一个仅限于Java双重语义的值来启动它。

转而使用new BigDecimal("12.99")new BigDecimal(1299, 2)