10

我试过BigDecimal.valueOf(Double.POSITIVE_INFINITY)了,但一直在NumberFormatException

谢谢

4

4 回答 4

16

你不能在 中表示无穷大BigDecimal

于 2012-04-09T21:26:58.793 回答
15

此行为对应于该方法应该工作的记录方式:valueOf

参数: val - 转换为 BigDecimal 的 double。

返回: 一个 BigDecimal,其值等于或大约等于 val 的值。

抛出: NumberFormatException - 如果 val 是无限的或 NaN。

于 2012-04-09T21:29:28.663 回答
0

您不能简单地从 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 接口冲突,并且不可避免地会导致相当多的开销编码

于 2014-03-27T11:25:28.833 回答
0

使用 Double.MIN_VALUE 和 Double.MAX_VALUE

于 2018-10-20T16:04:44.957 回答