BigInteger Bedingungsfehler

Status
Nicht offen für weitere Antworten.

tobinho

Mitglied
Hallo Leute,
hier mal ein kleiner Auszug aus meinem Problem:

...
BigInteger a = new BigInteger("234");
BigInteger b = new BigInteger("124");
BigInteger m = new BigInteger("2");
...
while(((a.mod(m))==BigInteger.ZERO)&&((b.mod(m))==BigInteger.ZERO))
{
k = k.add(BigInteger.ONE);
a = a.divide(m);
b = b.divide(m);
}
.....

Um den Code kurz zu erläutern, die while-Bedingung testet ob die beiden Zahlen a und b gerade sind,wobei m ein BigInteger Objekt mit dem Wert 2 ist. Dieser Test wird wie üblich mit einer Modulo-Operation durchgeführt. Trifft die Bedingung zu treten die Rechenoperationen in der Schleife ein.

Ich habe nun folgendes Problem:
Der Compiler findet keinen Fehler im Code und führt diesen ganz normal aus.Nachdem jedoch völlig irrsinnige Ergebnisse ausgespuckt werden, hab ich nochmal genauer hingeguckt.
Obwohl meine beiden Zahlen (a und b) gerade sind, sprich die Bedingung aus obiger Schleife eintritt, übergeht er die Schleife und führt die Operationen nicht durch. Ich sehe aber leider keinen Fehler darin, die Bedingung ist richtig programmiert und wird ja auch vom Compiler erkannt.

Bitte um Hilfe, evtl kennt sich einer mit diesem Problem aus.
Danke
 
S

SlaterB

Gast
a.mod(m) ist ein neu berechnes BigInteger-Objekt mit dem zufällig errechneten Wert 0,
aber es ist nicht das Objekt, welches hinter der statischen Konstante ZERO steht,

deshalb wie bei Strings immer equals zum Vergleich nehmen, nicht ==

-----

noch schlimmer bei BigDecimal:
Code:
public class Test
{

    public static void main(String[] args)
        throws ParseException
    {
        BigDecimal a = new BigDecimal("0");
        System.out.println(a.equals(BigDecimal.ZERO));
        a = a.setScale(2);
        System.out.println(a.equals(BigDecimal.ZERO));
    }
}
allein dadurch, dass man die Anzahl der Nachkommastellen auf 2 festlegt, gilt nichtmal mehr 0 equals 0
allerdings kennt man das von double, da ist ein Test auf == 0 auch selten angebraucht, lieber a-b < epsilon
 

0x7F800000

Top Contributor
tobinho hat gesagt.:
Ich sehe aber leider keinen Fehler darin, die Bedingung ist richtig programmiert und wird ja auch vom Compiler erkannt.
Jau, die Bedingung ist richtig programmiert, und wird vom compiler auch erkannt, nur leider tut sie nicht das was du gemeint hast ;)

Mit == prüfst du gleichheit von Objekten. Ein Objekt, zB. einen BigInteger kannst du dir als eine Art Box mit darin liegenden eigenschaften vorstellen. Was du hier hast, sind zwei verschiedene "Schachteln" mit dem gleichen Inhalt.
Wenn du die mit == vergleichst, dann gibt es false zurück, denn das sind ja verschiedene Objekte, obwohl die gleich aussehen.
Um die Gleichwertigkeit des Inhaltes zu vergleichen solltest du statt a==b die speziell dafür erstellte methode a.equals(b) benutzen. Das ist im prinzip genau dieselbe geschichte wie vergleiche von Strings: bei strings kommt die Frage dermaßen oft, dass es auf der 3. Stelle in der FAQ steht. Bei BigIntegern ist es dasselbe.

=> .equals() nehmen!
 

tobinho

Mitglied
Spitze ich danke euch vielmals! Immerhin wäre dieses Problem nun beseitigt

Ich bräuchte bitte nur noch einen kleinen weiteren Tip, der sich auf equals() bezieht ;D

while( t3 != BigInteger.ZERO )

Wie kann ich diese Bedingung nun in eine "negierte" equals() umschreiben ?
 
S

SlaterB

Gast
if (!x.equals(y))

generell muss man bei equals bedenken, ob nicht das erste Argument x null ist
-> NullPointerException
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben