# BigDecimal und Not a Number



## ARadauer (16. Dez 2011)

Ich hab einen fachlichen Anwendungfall wo ich unterscheiden muss, ob ein BegDecimal nicht gesetzt ist oder das Konvertieren fehl schlug.
Ich Konvertiere an einer anderen Stelle als ich dann Validieren. Gibt der benutzer nun einen Blödsinn ein, kann ich nicht konvertieren und geb null zurück. Ich weiß nun beim validieren nicht mehr ob er nix oder ein falschen Format eingegeben hat, möchte das aber gerne bei der Ausgabe berücksichtigen... Ein NaN wie bei double oder float wäre perfekt. Leider funktioniert das bei BigDecimal nicht... 

```
new BigDecimal(Double.NaN)
```
Oder mach ich es falsch?


Die Alternative eine Exception beim Konvertieren beim Konvertieren zu schmeiß und nachher zu berücksichtigen, würde ich gerne vermeiden.....


----------



## SlaterB (16. Dez 2011)

```
public BigDecimal(double val) {
 	if (Double.isInfinite(val) || Double.isNaN(val))
 	    throw new NumberFormatException("Infinite or NaN");
```
da ist nicht viel zu machen..

----

nicht ungenannt bleiben soll:
lege dir eine statische Konstante an, so wie es BigDecimal.ZERO gibt, 
static XY = irgendein BigDecimal,
später mit == vergleichen, 

oder irgendwas Richtung

```
BigDecimal k = new BigDecimal(Double.MAX_VALUE);
        k = k.multiply(k);
        System.out.println(k.doubleValue());
```
das liefert zumindest Infinity


----------



## Gregorrr (16. Dez 2011)

ARadauer hat gesagt.:


> Ich hab einen fachlichen Anwendungfall wo ich unterscheiden muss, ob ein BegDecimal nicht gesetzt ist oder das Konvertieren fehl schlug.
> Ich Konvertiere an einer anderen Stelle als ich dann Validieren. Gibt der benutzer nun einen Blödsinn ein, kann ich nicht konvertieren und geb null zurück. Ich weiß nun beim validieren nicht mehr ob er nix oder ein falschen Format eingegeben hat, möchte das aber gerne bei der Ausgabe berücksichtigen... Ein NaN wie bei double oder float wäre perfekt. Leider funktioniert das bei BigDecimal nicht...
> 
> ```
> ...



Wieso willst du die Exception nicht nach oben propagieren? Dafür sind sie ja gemacht, dass man aus dem linearen Programmfluss orthogonal verzweigen kann. Spaghetti wird bei relativ sparsamer Anwendung wenig gekocht.


----------



## bERt0r (16. Dez 2011)

> Die Alternative eine Exception beim Konvertieren beim Konvertieren zu schmeiß und nachher zu berücksichtigen, würde ich gerne vermeiden.....


Ich gehe davon aus, dass du erst eine Menge Doubles in BigDecimal konvertieren willst und danach erst die Validierung vornehmen möchtest.

Spontan würde mir einfallen, ist aber nicht sehr schön:

```
BigDecimal d=new BigDecimal(0)
		{
			@Override
			public double doubleValue()
			{
				return Double.NaN;
			}
		};
```


----------



## ARadauer (16. Dez 2011)

Danke für die Tipps, BigDecimal.ZERO und auch die Lösung scheinen mir brauchbare Möglichkeiten.


----------

