# BigDecimal < 0



## Isnogud (28. Aug 2012)

Hallo!
Ich hab ein Problem! Und zwar möchte ich abfragen, ob "number" negativ ist oder nicht. 
Leider kennt BigDecimal "<" nicht und der Compiler sagt mir als Fehler:




> the operator < is undefined for the argument type(s) java.math.BigDecimal, java.math.BigDecimal





```
public boolean isNegative(BigDecimal number) {
		if (number < number.ZERO) {
		return true;
		}
	}
```

Wie kann ich denn nun abfragen, ob number < 0, sprich negativ ist?


----------



## AngryDeveloper (28. Aug 2012)

Mit compareTo vergleichen:
BigDecimal (Java 2 Platform SE 5.0)


----------



## Isnogud (28. Aug 2012)

Ah! Cool, danke!


----------



## Gast2 (28. Aug 2012)

ZERO ist eine statische Konstante, daher sollte man die so nutzen: BigDecimal.ZERO.
Zwei BigDecimal Instanzen kannst du per compareTo vergleichen:

```
public boolean isNegative(BigDecimal number) {
  return number.compareTo(BigDecimal.ZERO) < 0;
}
```


----------



## Landei (28. Aug 2012)

```
public boolean isNegative(BigDecimal number) {
  return number.signum() == -1;
}
```


----------



## Isnogud (28. Aug 2012)

Ha!
Das funktioniert aber so nicht. Leider.


```
public boolean isNegative(BigDecimal number) {

		if (number.compareTo(BigDecimal.ZERO) < 0) {

			return true;
		}
		return false;

	}
```

So steht's jetzt bei mir.
Wenn der Wert true zurückgegeben wird, dann soll eine andere Methode erkennen dass number < 0 ist und die Fehlermeldung ausgeben, dass aus negativen Zahlen die Wurzel nicht gezogen werden kann.
Wird hingegen false zurückgegeben, sprich number ist eine positive Zahl, dann wird die Wurzel aus dieser gezogen. 

Im Endeffekt ist das egal, weil ich eh keine Wurzel aus BigDecimal Zahlen ziehen kann, nur, wenn ich eine komplizierte Klasse dazu selber schreibe, ich möchte es nur gerne komplett haben falls ich diese Klasse doch irgendwann bereit bin zu schreiben.

//Moment, hab grad alles durcheinander gebracht


----------



## Crian (28. Aug 2012)

Unterscheidet BigDecimal zwischen "+0" und "-0"?


----------



## Gast2 (28. Aug 2012)

Dann liegt der Fehler im Übergabeparameter, die Methode ist so korrekt:


```
public static void main(String[] args) {
	System.out.println(isNegative(BigDecimal.ONE));
	System.out.println(isNegative(BigDecimal.TEN));
	System.out.println(isNegative(BigDecimal.ZERO));
	System.out.println(isNegative(new BigDecimal("-1")));
	System.out.println(isNegative(new BigDecimal("-10")));
}

public static boolean isNegative(BigDecimal number) {
	if (number.compareTo(BigDecimal.ZERO) < 0) {
		return true;
	}
	return false;
}
```

EDIT:
Die Methode lässt sich noch kürzer schreiben, siehe mein Beispiel, oder das Beispiel von Landei.


----------



## Isnogud (28. Aug 2012)

Ich meld mich nochmal wenn ich mein kürmeliges Package aufgeräumt hab. 
Trotzdem danke!


----------



## Landei (28. Aug 2012)

Erstens funktioniert das ganz wunderbar, zweitens funtioniert auch EikeB's Version prima, und drittens ist dein seltsames if-Konstrukt völlig redundant. Lerne ein wenig die Logik-Grundlagen und vermeide Regentänze, wenn du etwas nicht verstehst, sonst beglückst du deine Umwelt auch noch eines Tages mit einer YesNoFactory.


----------



## SlaterB (28. Aug 2012)

es gibt auch eine signum()-Methode, die sich nur bei Negativprüfung etwas eher anbietet, wird im compare auch verwendet:

```
public int compareTo(BigDecimal val) {
	// Optimization: would run fine without the next three lines
	int sigDiff = signum() - val.signum();
	if (sigDiff != 0)
	    return (sigDiff > 0 ? 1 : -1);
```
insofern auch nicht schlimm, wenn compare genutzt wird (nicht dass es generell ein Problem wäre)


compare sollte funktionieren, equals ist bisschen fragwürdiger, 
ein BigDecimal aus "0.00" ist nicht equal zu ZERO, auch Nachkommastellen werden verglichen


----------



## Crian (28. Aug 2012)

Unterscheidet BigDecimal zwischen "+0" und "-0"?


----------



## Landei (28. Aug 2012)

Ja. Und auch zwischen 0, 0.0, 0.00...


----------

