double Runden auf beliebig viele Stellen
lima-city → Forum → Programmiersprachen → Java
addieren
anzahl
beispiel
darstellung
double
ergebnis
genauigkeit
komma
kurze frage
machen
mathematiker
null
platz
prinzip
rechts verschieben
stelle
stellen
teilen
umsteigen
verzeihen
-
Hallo zusammen,
ich hätte eine kurze Frage zum Runden von double Werten. Ich hab zwar die Funktion Math.round(ergebnis*100)/100.0; via google gefunden, allerdings versteh ich nicht ganz, wie man auf beliebig viele Stellen runden kann und was das Prinzip dahinter ist.
MfG
Thomas -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi,
laut Doku macht Math.round() auch nur (bis auf Sonderfälle +/- oo): (int)Math.floor(a + 0.5f)
Beispiel: Für a = 0.3 wird also Math.floor(0.8) = 0 und für a=0.7 wird Math.floor(1.2) = 1 berechnet - Sieht wie Ab-/Aufrunden aus.
Wenn man auf Nachkommastellen runden möchte, dann muss man halt das Komma erst einmal nach rechts verschieben (also mit einer Zehnerpotenz multiplizieren), 0.5 addieren und dann wieder das Komma nach links verschieben (also durch eine Zehnerpotenz dividieren):
Also z.B. mit s = 10 ( = 10^1) schiebt man das Komma eine Stelle nach rechts. Für n Stellen: s= 10^n;
(float)Math.floor( a * s + 0.5f) / s;
Beispiel: a=1.36, s=10 --> Math.floor( 13.6 + 0.5 ) / 10 = Math.floor( 14.1 ) / 10 = 14/10 = 1.4
Das funktioniert natürlich nur solange, wie die Genauigkeit der Zahlendarstellung (float, double) ausreicht.
Ggf. muss man auf Zahlendarstellungen mit höherer Genauigkeit oder Strings umsteigen.
.oO( Mögen mir die Mathematiker für meine Darstellung verzeihen )
-
Ist eigentlich ganz einfach. Ergebnis*100 bedeutet, dass das Komma im Ergebnis um 2 Stellen nach rechts verschoben wird. Aus 2.1154 wird so 211.54. Math.round rundet immer auf die erste Vorkommastelle, heißt also, dass nun die 5 genutzt wird um die 1 aufzurunden. Aus 211.54 wird 212. Da jetzt noch durch 100.0 geteilt wird, wird das Komma wieder an seinen ursprünglichen Platz zurück geschoben: aus 212 wird 2.12. Es wird also durch die Anzahl der Nullen an der 1 vorgegeben, auf welche Stelle gerundet wird:
Math.round(ergebnis*10)/10.0 => 1 Nachkommastelle (aus 2.1154 wird 2.1)
Math.round(ergebnis*100)/100.0 => 2 Nachkommastellen (aus 2.1154 wird 2.12)
Math.round(ergebnis*1000)/1000.0 => 3 Nachkommastellen (aus 2.1154 wird 2.115)
...
Wichtig ist, durch 100.0 zu teilen, damit JAVA auch wirklich double oder float erhält und nicht int.
€dit: @perlbotics: Ja, so gehts natürlich auch
Beitrag zuletzt geändert: 7.2.2013 20:38:37 von alphara -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage