代码之家  ›  专栏  ›  技术社区  ›  BenjaminJC

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

  •  12
  • BenjaminJC  · 技术社区  · 7 年前

    new BigDecimal(12.99).setScale(2, BigDecimal.ROUND_HALF_EVEN . 然而,编译器告诉我 setScale(int, int)

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

    谢谢

    3 回复  |  直到 7 年前
        1
  •  28
  •   Mad Physicist    7 年前

    根据文件, setScale(int, int) ,此后未被推荐 Java 1.5 ,首次引入枚举时:

    setScale(int, RoundingMode) 方法应优先于此遗留方法。

    它最终在年被弃用 Java 9 .

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

        2
  •  7
  •   assylias    7 年前

    不应“实例化”枚举,而应使用其常量。您是否尝试过:

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

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

    new BigDecimal("12.99");
    
        3
  •  2
  •   GhostCat    7 年前

    其他答案为舍入模式提供了很好的指导——但在某种程度上,它们错过了另一个关键点。从 javadoc :

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

    双重的 价值,然后 浮点

    换句话说:您打算使用一个特殊的、昂贵的“开销”对象来处理任意浮点数。但首先要基于一个仅限于Java双重语义的值。

    为...而去 new BigDecimal("12.99") 相反,或者 new BigDecimal(1299, 2) .