2012-04-09 18 views
10

Ich versuchte BigDecimal.valueOf(Double.POSITIVE_INFINITY), behielt aber NumberFormatExceptionWie konvertiert man Double.POSITIVE_INFINITY in BigDecimal?

Dank

+7

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

+0

Die beste Lösung, die ich mir vorstellen kann, ist die Implementierung einer Unterklasse von BigDecimal mit dieser Fähigkeit, wenn Sie die Funktionen von BigDecimal und Infinity benötigen. –

Antwort

14

Dieses Verhalten entspricht die documented Weise der valueOf Methode funktionieren soll:

Parameter: val - doppelt auf eine BigDecimal zu konvertieren.

Rückgabe: ein BigDecimal, dessen Wert gleich oder ungefähr gleich dem Wert von val ist.

Auslöser: NumberFormatException - if val ist unendlich oder NaN.

15

Sie können nicht unendlich in BigDecimal darstellen zu bekommen.

0

Sie können nicht einfach eine Kindklasse von BigDecimal ableiten, um NaN und Infinite zu unterstützen. Beim Ableiten einer Kindklasse müssen die Konstruktoren des Elternteils implementiert werden. Und der Elternkonstruktor muss zuerst im Kindkonstruktor aufgerufen werden. BigDecimal hat eine Anzahl von Konstruktoren, z.B. BigDecimal (Doppelwert). Wie jedoch JAVA doc zeigt, sollte double val nicht NaN oder unendlich sein. Andernfalls wird eine NumberFormatException ausgelöst. Wenn Sie BigDecimal auf MyBigDecimal erweitern, denke ich, dass Sie auch einen ähnlichen Konstruktor benötigen, der MyBigDecimal (double val) ist. Problem ist, MyBigDecimal (double val) muss super (val) als erste Anweisung (Java-Anforderung) aufrufen. Sie können nicht etwas wie if (val == Double.NaN) hinzufügen oder versuchen, catch vor super (val). So ist die MyBigDecimal (Doppel val) Funktion muss wie:

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

Als solche gibt es keine Möglichkeit val zu Double.NaN oder Unendlichen gesetzt, da diese ohnehin in Number führt.

Leider ist BigDecimal eine schreibgeschützte Klasse, d. H. Sie haben keine Möglichkeit, den Wert mithilfe einer Funktion wie setValue (...) zurückzusetzen. Sie können also NaN oder unendlich keiner erweiterten Klasse von BigDecimal zuweisen.

Die einzige Lösung, die eine Wrapper verwendet, das heißt

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

klar, das wird eine sehr einfache Implementierung nicht sein.

Es ist ziemlich seltsam, dass Oracle BigDecimal NaN oder unendlich in JAVA 7 nicht unterstützt hat. Aber ich glaube, BigDecimal wird diese Werte endlich unterstützen. Ich würde vorschlagen, nicht NaN oder unendlich zu berühren, wenn Sie BigDecimal in diesem Moment verwenden. Andernfalls, nachdem NaN und infinite unterstützt werden, könnte das benutzerdefinierte MyBigDecimal mit den neuen BigDecimal-Interfaces in Konflikt geraten und führt unweigerlich zu ziemlich viel Overhead-Codierung.