Anzeige der Nachkommastelle "springt" beim summieren
su
- javascript
0 Sven Rautenberg0 su
hallo forum,
beim summieren von zahlen mit unterschiedlichen nachkommastellen 'springt' bei der summe die nachkommastelle über die anzahl hinaus. wie kann ich diese "scheinbar falsche rundung" verhindern??
wert_1: 2.999999 -> summe:2.999999
wert_2: 1234.001 -> summe:1237.0009989999998
wert_3: 2.000001 -> summe:1239.001
die funktion dazu:
var sumConsumption = 0;
var aMonth = new Array("2.999999","1234.001","2.000001");
for (var i = 0; i < aMonth.length; i++)
{
t_month = aMonth[i];
sumConsumption = eval(sumConsumption) + eval(t_month);
alert(sumConsumption);
}
gruß su
Moin!
hallo forum,
beim summieren von zahlen mit unterschiedlichen nachkommastellen 'springt' bei der summe die nachkommastelle über die anzahl hinaus. wie kann ich diese "scheinbar falsche rundung" verhindern??
Die Rundung ist eben nur scheinbar falsch. Das sind aber ganz normale Vorgänge beim Computer-Rechnen mit Fließkommazahlen.
Das Problem ist: Der Computer stellt Zahlen intern binär dar. Er kann ganz prima ganze Zahlen verwalten, und ansonsten nur binäre Brüche, die sich im Dezimalsystem 1/2, 1/4, 1/8, 1/16... etc. nennen.
Wenn deine Dezimalzahl nicht durch eine Kombination von binären Brüchen darstellbar ist, muß der Computer runden. Insbesondere hat der Computer kein 1/10, 1/100, 1/1000 usw., das sorgt für die primären Probleme. Keine Kombination von binären Brüchen kann diese Dezimalbrüche bilden (das sagt uns z.B. die Primzahlzerlegung der Nenner.
Bei dezimal rechnenden Taschenrechnern treten Rundungsfehler ja übrigens auch auf, wenn man zu lange Nachkommastellen hat. Aber wir sind das Dezimalsystem eben gewohnt, und auch dessen Rundungsfehler. Binäre Rundungsfehler treten unerwartet auf, weil wir nicht binär rechnen.
Verhindern kannst du da gar nichts. Du kannst versuchen, nur mit Integern zu rechnen, und für die Ausgabe der Zahl dann das Komma passend zu setzen. Sowas wird z.B. beim Rechnen mit Geldbeträgen gemacht (einfach in ganzen Cent rechnen - dann treten keine Rundungsfehler unerwartet auf). Bei beliebigen Kommazahlen dürfte das aber unmöglich sein.
- Sven Rautenberg
hallo sven - danke für deine zahlen-philosophische antwort. die summe muß ich nur dem kunden anzeigen (also letzten endes ein kosmetisches problem) in die DB werden nur die Summanden eingelesen.
schönen tag noch
die su