2012-04-09 13 views
10

me trataron BigDecimal.valueOf(Double.POSITIVE_INFINITY), pero cuidado para conseguir NumberFormatExceptionCómo convertir Double.POSITIVE_INFINITY a BigDecimal?

Gracias

+7

'BigDecimal infinito = BigDecimal.ZERO; for (;;) = infinito infinity.add (BigDecimal.ONE); ' – Jeffrey

+0

La mejor solución que se me ocurre es implementar una subclase de BigDecimal que tiene esta capacidad, si usted necesita las características de ambos BigDecimal e infinito. –

Respuesta

14

Este comportamiento se corresponde con la forma en que se supone documented el método valueOf a trabajar:

Parámetros: val - dobles para convertir a un BigDecimal.

Devuelve: un BigDecimal cuyo valor es igual o aproximadamente igual al valor de val.

Throws: NumberFormatException - si val es infinito o NaN.

15

No se puede representar el infinito en BigDecimal.

0

No se puede derivar simplemente una clase hija de BigDecimal para admitir NaN e Infinite. Al derivar una clase secundaria, los constructores de los padres deben implementarse. Y el constructor padre debe ser llamado primero en el constructor hijo. BigDecimal tiene una cantidad de constructores, p. BigDecimal (doble val). Sin embargo, como señala JAVA doc, double val no debe ser NaN o infinito. De lo contrario, arroja una excepción NumberFormatException. Si extiende BigDecimal a MyBigDecimal, creo que también necesita un constructor similar que sea MyBigDecimal (double val). El problema es que MyBigDecimal (double val) tiene que llamar a super (val) como la primera instrucción (requisito de Java). No puede agregar algo como if (val == Double.NaN) o try catch before super (val). Por lo tanto la función MyBigDecimal (doble val) tiene que ser así:

public MyBigDecimal(double val) { 
    super(val); 
    ... 
} 

Como tal, no hay manera de poner val Double.NaN o infinito, porque esto se traduce en NumberFormatException de todos modos.

Más Desafortunadamente, BigDecimal es una única clase leer, es decir, que no hay manera de restablecer su valor usando una función como setValue (...). Entonces nunca puedes asignar NaN o infinito a una clase extendida BigDecimal.

La única solución es utilizar un contenedor, es decir

class MyBigDecimal { 
    public BigDecimal mbigDecNormalValue; 
    public double mdNaNOrInf; 
    ... 

claramente, esto no va a ser una aplicación muy simple.

Es bastante extraño que Oracle no ha apoyado BigDecimal NaN o infinito en JAVA 7. Pero creo BigDecimal finalmente apoyará estos valores. Sugeriría que no toques NaN o infinito cuando uses BigDecimal en este momento. De lo contrario después de NaN e infinito son compatibles, el usuario MyBigDecimal definido podría entrar en conflicto con las nuevas interfaces BigDecimal e inevitablemente provoca más o menos sobrecarga de codificación

Cuestiones relacionadas