如何将Double.POSITIVE_INFINITY转换为BigDecimal?

时间:2012-04-09 21:24:44

标签: java

我尝试BigDecimal.valueOf(Double.POSITIVE_INFINITY),但不断获得NumberFormatException

由于

4 个答案:

答案 0 :(得分:16)

您无法在BigDecimal中表示无穷大。

答案 1 :(得分:15)

此行为对应于valueOf方法应该起作用的documented方式:

  

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

     

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

     

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

答案 2 :(得分:0)

你不能简单地从BigDecimal派生一个子类来支持NaN和Infinite。在派生子类时,必须实现父类的构造函数。并且必须在子构造函数中首先调用父构造函数。 BigDecimal有许多构造函数,例如BigDecimal(双val)。但是,正如JAVA doc指出的那样,双重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;
    ...
显然,这不是一个非常简单的实现。

很奇怪甲骨文在JAVA 7中不支持BigDecimal NaN或无限。但我相信BigDecimal最终会支持这些值。我建议你在这个时候使用BigDecimal时不要触摸NaN或无限。否则在支持NaN和无限之后,用户定义的MyBigDecimal可能会与新的BigDecimal接口发生冲突,并且不可避免地导致相当多的开销编码

答案 3 :(得分:0)

使用Double.MIN_VALUE和Double.MAX_VALUE