【问题标题】:Deprecated constructor for BigDecimal.setScale(int, int) and RoundingMode enumsBigDecimal.setScale(int, int) 和 RoundingMode 枚举的弃用构造函数
【发布时间】:2017-11-13 15:35:33
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 显示一个可运行的示例,其中包含我可以复制到编辑器中以重现您的问题的代码。
  • 如果你想创建一个值为 12.99 的 BigDecimal,只需使用 BigDecimal.valueOf(1299, 2)
  • @KlitosKyriacou。我的意思是导致“未初始化”问题的代码。感谢您了解这一点。
  • @MadPhysicist 我没有和你说话;)我同意你所说的。我的评论只是让 OP 知道另一种初始化 BigDecimal 的方法(这也保证不四舍五入)。

标签: java enums deprecated bigdecimal deprecation-warning


【解决方案1】:

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

应该优先使用新的setScale(int, RoundingMode) 方法而不是这个旧方法。

它最终在Java 9 中被弃用。

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

【讨论】:

    【解决方案2】:

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

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

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

    new BigDecimal("12.99");
    

    【讨论】:

      【解决方案3】:

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

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

      重点是:当你传递一个 double 值时,floating point 语义就会发挥作用。

      换句话说:您打算使用一个特殊的、昂贵的“开销”对象来处理任意浮点数。但是你从一个限制在 Java 双重语义的值上开始做这件事。

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

      【讨论】:

      • 很好的信息,但技术上不是 OP 所要求的。无论如何都要 +1
      • 感谢您的意见。鉴于 OP 提供的代码示例,我稍微改写了我的答案,以更清楚地说明为什么它有真正的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2021-12-18
      • 2010-12-21
      • 1970-01-01
      • 2011-08-20
      • 2018-05-30
      • 1970-01-01
      相关资源
      最近更新 更多