Axel Richter: Rechenfehler in JavaScript

Beitrag lesen

Hallo,

weil ich alle Zwischenergebnisse brauche. Ich will die Punkte wissen, wo ich bei gleichmäßiger Teilung der Strecke sozusagen die Pfähle einschlagen muß.

Das geht nur in begrenzter Genauigkeit. Die Additionsungenauigkeit bekommst Du aber weg, indem Du die Positionen der Pfähle nach der Berechnung so genau, wie erforderlich, rundest.
Beispiel:

var start = 127;
var ende = 16384;
var teile = 10
var schrittw = (ende-start)/teile;
document.writeln("Strecke = " + (ende-start) + "<br>");
document.writeln("Schrittweite = " + schrittw + "<br>");
var strecke = 0;
for (i=0; i<teile; i++) {
  strecke = Math.round((strecke + schrittw)*100)/100;
  document.writeln("Nach Teil " + (i+1) + " ist Strecke = " + strecke + "<br>");
}

Ohne Rundung käme heraus:
Strecke = 16257
Schrittweite = 1625.7
Nach Teil 1 ist Strecke = 1625.7
Nach Teil 2 ist Strecke = 3251.4
Nach Teil 3 ist Strecke = 4877.1
Nach Teil 4 ist Strecke = 6502.8
Nach Teil 5 ist Strecke = 8128.5
Nach Teil 6 ist Strecke = 9754.2
Nach Teil 7 ist Strecke = 11379.900000000001
Nach Teil 8 ist Strecke = 13005.600000000002
Nach Teil 9 ist Strecke = 14631.300000000003
Nach Teil 10 ist Strecke = 16257.000000000003

Aber 16257 _ist_ nunmal _dezimal_ in 10 gleiche Teile teilbar. Die gerundete Variante kann das auch.

Willst Du aber bspw. nur 7 Teile, dann kommt es halt dauf an, mit welcher Abweichung Du leben kannst. Beispielsweise wäre die, mit Rundung auf 4 Nachkommastellen (Math.round((strecke + schrittw)*10000)/10000;):
Strecke = 16257
Schrittweite = 2322.4285714285715
Nach Teil 1 ist Strecke = 2322.4286
Nach Teil 2 ist Strecke = 4644.8572
Nach Teil 3 ist Strecke = 6967.2858
Nach Teil 4 ist Strecke = 9289.7144
Nach Teil 5 ist Strecke = 11612.143
Nach Teil 6 ist Strecke = 13934.5716
Nach Teil 7 ist Strecke = 16257.0002

Denn 16257 ist nunmal auch dezimal nicht endlich in 7 Teile teilbar.
     ______
2322,428571

viele Grüße

Axel