Kawusel: Summierung in for-Schleife gibt falsches Ergebnis

Hallo,

ich erhalte bei folgendem Beispiel fehlerhafte Werte, sobald der
Index meiner Auswahlliste 7 oder größer ist.
Für elm.selectedIndex = 6 erhalte ich noch den richtigen Wert 1.12
Für elm.selectedIndex = 7 erhalte ich 1.1400000000000001

Entweder habe ich gerade ein Brett vor dem Kopf und sehe den Wald vor lauter Bäumen nicht, oder irgendwas funktioniert da mit den Typen nicht. Vielleicht weiß ja einer von euch Rat.

Hier mein Scriptauszug:

var incRateNextYear = 0.01;
var incRateNextNextYear = 0.03;
var incRateFutureYears = 0.02;

function setYearRate(elm) { // elm ist eine Formular-Auswahlliste
var sum = 0;
switch (elm.selectedIndex) {  // ab elm.selectedIndex>=7 gehts schief
 case 0:
  sum = 1;
 break;
 case 1:
  sum = 1 + incRateNextYear;
  alert ("2003 "+sum);
 break;
 case 2:
  sum = 1 + incRateNextYear + incRateNextNextYear;
  alert ("2004 "+sum);
 break;
 case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10:
  sum = 1 + incRateNextYear + incRateNextNextYear;
  for (var i=3; i<=elm.selectedIndex; i++) {
   sum = sum + incRateFutureYears;
  }
  alert ("2005+ "+sum);
 break;
}
return sum;
}

Vielleicht weiß einer von euch ja zumindest, wo ich sonst suchen konnte, unter selfhtml und im Archiv hab ich bis jetzt noch nichts entdeckt.

MfG
Judith Merges

  1. Hi!

    ich erhalte bei folgendem Beispiel fehlerhafte Werte, sobald der
    Index meiner Auswahlliste 7 oder größer ist.
    Für elm.selectedIndex = 6 erhalte ich noch den richtigen Wert 1.12
    Für elm.selectedIndex = 7 erhalte ich 1.1400000000000001

    Das sieht mir nach einem typischen Rundungsfehler aus. Das ist leider nicht zu verhindern und kommt in jeder Programmiersprache vor - damit hab ich mich auch schon oft rumgeschlagen. Hängt irgendwie damit zusammen, wie Fließkommazahlen als byte-Werte verarbeitet werden.

    case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10:

    Hier würde ich "default:" benutzen.

    return sum;

    Versuch mal, den Wert vorher zu runden:

    return Math.round(sum*100)/100;

    (Für mehr Stellen einfach ein paar Nullen anhängen :)

    VG Simon

    1. Hi

      return Math.round(sum*100)/100;

      (Für mehr Stellen einfach ein paar Nullen anhängen :)

      Ich wär vorsichtig mit der Division
      durch 100, da können wieder tolle Rundungsfehler reinkommen!

      Das hängt damit zusammen dass 100 keine 2er Potenz ist
      aber intern binär gerechnet und dann ins dezimale umgesetzt wird!

      Deswegen 2 Möglichkeiten:

      1. ihr rechnet nur Math.round(sum*100) und fügt den Dezimalpunkt per Stringmanipulation ein.

      2. ihr rechnet nur Math.round(sum*100+0.5)/100 und schneidet alles nach der 2. Nachkommastelle per Stringbefehl ab.

      Tschau
        Rolf