Summierung in for-Schleife gibt falsches Ergebnis
Kawusel
- javascript
0 Simon Reinhardt0 LanX
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
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
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