• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Rundungsproblem

nrg_

New member
Hallo Zusammen,

wenn man 1.045 * 19 nimmt, kommt 19.854999999999997 raus. Ihr müsst mir nicht erklären, warum das so ist. Das hat ja in erster Linie mit der binären Darstellung von Gleitkommazahlen zu tun. Außerdem gibt es dazu Threads wie Sand am Meer ;).

Wenn ich jetzt aber diesen Wert auf 2 Nachkommastellen runde, kommt 19.85 raus.

Code:
alert Math.round((1.045*19)*100)/100;
//19.85

Das ja eigentlich falsch ist. Im Dezimalsystem hätte o.g. Rechnung 19.855 ergeben, was gerundet 19.86 entspricht. Mit toFixed(2) hat man das gleiche Problem...

Jemand eine Idee, wie man hier anständig kaufmännisch Runden soll?

Grüße
nrg
 
Zuletzt bearbeitet:
Ja aber du rundest doch auf 2 Stellen nach dem Komma und das sind 19.85, da du nur die 3te Stelle betrachtest...also die 4. wenn du 3 stellen rundest alert Math.round((1.045*19)*1000)/1000; kommst du auf 19.855. Also passt doch alles.

Die Rundung ist also völlig richtig.


Dein Denkfehler ist das du erst auf 3 Stellen nach den Komma rundest und dann auf 2 Stellen.
 
passt vielleicht in diesem Beispiel. Bei einer anderen Rechnung ergibt das durch 1000 dann wiederrum eine Zahl, die im Binärsystem nicht richtig dargestellt werden kann und die Rundung funktioniert wieder nicht kaufmännisch richtig. in anderen Sprachen gibt es hier genauere Datentypen.... wie macht man das in JS?
 
nrg_ schrieb:
Das hat ja in erster Linie mit der binären Darstellung von Gleitkommazahlen zu tun
Datentypen und Javascript ist immer so ein Prob. manche machen dafür ein Umweg über Typedarrays aber Typedarrays und runden müsste man dann bitweise machen.

für die neuern Browser außer ie gibt es fround:
console.log(Math.round(Math.fround(1.045*19*100))/100);
19.86

Fallback ie:
Code:
function round(Zahl){
 var f32 = new Float32Array(1);
 f32[0] = Zahl, f32[0];
 return f32[0];
}

console.log(Math.round(round(1.045*19*100))/100);//19.86
 console.log(Math.round(round(0.2122065907891938*100))/100);
 console.log(Math.round(round( 0.6366197723675814*100))/100);

Allerdings sehe ich da ein Problem es wird immer mit 100 Multipliziert und Dividiert um auf 2 Nachkommastellen zu kommen. Was ist wenn durch die Multiplikation der Wertebereich eines Floats verlassen wird?? Sicherlich kommt NaN raus aber wie ist die alternative?

Hesst wäre derjenige der da jetzt weiter helfen kann.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben