我试过BigDecimal.valueOf(Double.POSITIVE_INFINITY)
了,但一直在NumberFormatException
谢谢
你不能在 中表示无穷大BigDecimal
。
此行为对应于该方法应该工作的记录方式:valueOf
参数: val - 转换为 BigDecimal 的 double。
返回: 一个 BigDecimal,其值等于或大约等于 val 的值。
抛出: NumberFormatException - 如果 val 是无限的或 NaN。
您不能简单地从 BigDecimal 派生一个子类来支持 NaN 和 Infinite。在派生子类时,必须实现父类的构造函数。并且必须首先在子构造函数中调用父构造函数。BigDecimal 有许多构造函数,例如 BigDecimal(double val)。但是,正如 JAVA doc 指出的那样,double val 不应该是 NaN 或无穷大。否则,将引发 NumberFormatException。如果将 BigDecimal 扩展到 MyBigDecimal,我认为您还需要一个类似的构造函数,即 MyBigDecimal(double val)。问题是,MyBigDecimal(double val) 必须调用 super(val) 作为第一条语句(Java 要求)。您不能添加类似 if(val == Double.NaN) 的内容或在 super(val) 之前尝试 catch。所以 MyBigDecimal(double val) 函数必须像:
public MyBigDecimal(double val) {
super(val);
...
}
因此,无法将 val 设置为 Double.NaN 或 Infinite,因为这无论如何都会导致 NumberFormatException。
更不幸的是,BigDecimal 是一个只读类,也就是说,您无法使用 setValue(...) 之类的函数来重置其值。因此,您永远不能将 NaN 或无限分配给 BigDecimal 扩展类。
唯一的解决方案是使用包装器,即
class MyBigDecimal {
public BigDecimal mbigDecNormalValue;
public double mdNaNOrInf;
...
显然,这将不是一个非常简单的实现。
很奇怪,Oracle 在 JAVA 7 中不支持 BigDecimal NaN 或无限大。但我相信 BigDecimal 最终会支持这些值。我建议您此时使用 BigDecimal 时不要触摸 NaN 或无穷大。否则在支持 NaN 和无限后,用户定义的 MyBigDecimal 可能会与新的 BigDecimal 接口冲突,并且不可避免地会导致相当多的开销编码
使用 Double.MIN_VALUE 和 Double.MAX_VALUE