Fredo: Subtraktionsfehler?!

Hallo,

ich hab wahrscheinlich einen ziemlich blöden Fehler gemacht weiß aber nicht welchen.

Ich hab eine ArrayList, in der zehn Kommazahlen stehen:
1.83
5.42
1.99
3.17
0.49
7.13
2.12
3.06
1.21
3.00

jetzt kontrolliert mein Programm, ob die Nachkommastellen von je zwei Zahlen in der Addition (nach Multiplikation mit 100) 11,33,55,77 oder 99 ergeben.

Um die Ziffern vor dem Komma wegzubekommen, runde ich die Zahlen und subtrahiere den gerundeten Betrag!

also z.b. bei 5.42 und 7.13:

|(5.42 - 5)| + |(7.13-7)| = 0.55 (mit 100 multipliziert : 55 )

allerdings ergibt bei mir die Subtraktion eine Irrationale Zahl?!

Wie kann das sein??

Hier mal etwas Quelltext:

for (int n=0;n<10;n++){
        for (int j=0;j<10;j++){

Double x = (Double)Preise.get(n);
          Double y = (Double)Preise.get(j);
          double b = (Math.abs(x-Math.round(x)) + Math.abs(y-Math.round(y)))*100.0 ;  //b=addierter Cent-Betrag

if ( b != 11.0 || b != 33.0 || b != 55.0 || b != 77.0 || b != 99.0 ) {

b = b * Math.PI;      // damit bei umwandeln von double auf int nicht zufällig der richtige wert rauskommt
           b = Math.round(b);
           a = (int) b;

if (a > 100){       //Mögliche Überläufe beseitigen
            a = a - 100;
           }
          }else{

a = (int) b ;

if (a > 100){       //Mögliche Überläufe beseitigen
            a = a - 100;
           }
          }

switch (a)       //Auf Treffer untersuchen
            {
             case 11: Matches.add(Preise.get(n));
                        Matches.add(Preise.get(j));

Preise.remove(n);
                        Preise.remove(j);
                        break;

case 33: Matches.add(Preise.get(n));
                        Matches.add(Preise.get(j));

Preise.remove(n);
                        Preise.remove(j);
                        break;

case 55: Matches.add(Preise.get(n));
                        Matches.add(Preise.get(j));

Preise.remove(n);
                        Preise.remove(j);
                        break;

case 77:Matches.add(Preise.get(n));
                        Matches.add(Preise.get(j));

Preise.remove(n);
                        Preise.remove(j);
                        break;

case 99: Matches.add(Preise.get(n));
                        Matches.add(Preise.get(j));

Preise.remove(n);
                        Preise.remove(j);
                        break;

default: break;

}

}
      }

  1. Hallo,

    Ich denke mal, dass da Rundungsfehler auftreten.

    Um die Ziffern vor dem Komma wegzubekommen, runde ich die Zahlen und subtrahiere den gerundeten Betrag!

    Nimm sie doch einfach Modulo 1. Vielleicht geht's dann besser und schneller. Rundungsfehler sind aber trotzdem drin. Man müsste die Zahl am Ende nochmal extra in Integer wandeln.

    also z.b. bei 5.42 und 7.13:

    |(5.42 % 1)| + |(7.13 % 1)| = 0.55 (mit 100 multipliziert : 55 )

    Gruß, Don P