我尝试使用以下内容指定BigDecimal值的精度:new BigDecimal(12.99).setScale(2, BigDecimal.ROUND_HALF_EVEN
。但是,编译器告诉我setScale(int, int)
已被弃用。
当我尝试使用RoundingMode枚举时,它告诉我枚举可能尚未初始化。如何正确使用枚举来使用setScale(int, RoundingMode)
实例化BigDecimal?
谢谢!
答案 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)
。