Java double Runden?
Ich möchte eine double variable auf die erste Nachkommastelle Runden
2 Antworten
Einen double runden ist selten sinnvoll.
Ein double hat nämlich keine definierte zahl an nachkommastellen, ein double ist überhaupt keine genaue dezimal Zahl, nur eine Annährung. Wenn du eine richtige dezimalzahl willst, also genau 2050.5 oder so, solltest du bigDecimal oder ähnliches nutzen.
Du solltest dich nie dadrauf verlassen dass du eine bestimmte Anzahl an nachkommastellen hast bei einem double.
Wenn du den wert einfach mit weniger nachkommastellen als String ausgeben willst, kannst du String.format() nutzen.
Eben hast du runden gesagt, jetzt willst du die nachkommastellen abschneiden, was nun? 135.596266 ist gerundet 135.6 und mit den nachkommastellen abgeschnitten 135.5
Wie gesagt, String.format(), das rundet.
Double d1 = 125.52362636;
String s1 = String.format("%.1f", d1);
System.out.println(s1);
Aber achtung, wenn dein system auf deutsch ist, mit komma als dezimalpunkt, musst du vielleicht %,1f schreiben
oder gleich printf
Double d1 = 125.52362636;
System.out.printf("%.1f", d1);
Aber achtung, wenn dein system auf deutsch ist,
Meinst Du etwa
Doppel d1 = 125.52362636;
Zeichenkette s1 = Zeichenkette.formatiere("%,1f", d1);
System.aus.druckzl(s1);
Entspann Dich mal. So einen Schwachsinn gibt es nur bei Microsoft.
Oh, stimmt, hast du recht.
System.out.printf(Locale.GERMAN, "%.1f\n", 125.52362636);
funktioniert auch.
Ich glaube von irgendwo hatte ich sowas im kopf... microsoft war es nicht.
Ich glaube das problem hatte ich in python... gehabt
Das geht nicht
import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
print("{:.1f}".format(125.52362636))
Das schon
import locale
locale.setlocale(locale.LC_ALL, 'en_US')
print("{:.1f}".format(125.52362636))
Aber wenn es in java geht ist ja gut.
Zum Beispiel so:
double zahl = 10.751245;
int nks = 1; //Anzahl Nachkommastellen
double faktor = Math.pow(10.0,nks);
double roundOff = Math.round(zahl * faktor) / faktor;
Dann hätte roundOff den Wert 10.8
Gibt aber auch noch viele andere Möglichkeiten.
Es hätte annährend den wert 10.8, nicht genau.
Wenn du roundOff*roundOff rechnest kommt halt 116.64000000000001 raus.
Runden ist halt in 99% der Fälle sinnlos wenn die werte sowieso nicht exakt sind.
Wenn man den wert einfach nur mit weniger Nachkommastellen ausgeben will, benutzt man einfach String.format() oder so, den wert an sich sollte man dafür nicht ändern.
Es hätte annährend den wert 10.8, nicht genau.
In der Ausgabe erscheint der Wert 10.8 von daher ist in roundOff der richtig gerundete Wert von Zahl, man hat aber immer noch die Zahl zum Weiterrechnen, sollte man die exakte Differenz brauchen.
Daher vielen Dank für deinen Input, wenn auch absolut unnötig.
Nein, es ist tatsächlich 10.800000000000000710. Das rundet java aber automatisch auf 10.8.
System.out.println(10.800000000000000710);
Das code snippet gibt 10.8 aus, obwohl es ja offensichtlich nicht 10.8 ist.
Alles zwischen 10.7999999999999999 und 10.8000000000000015 ist 10.800000000000000710.
Und wenn du genug nachkommastellen schreibst rundet java dir das automatisch.
Vielleicht noch ein paar mehr beispiele was dir java ausgibt.
10.7999999999999999 =
10.8
10.800000000000001 =
10.8
10.800000000000002 =
10.800000000000002
10.800000000000003 =
10.800000000000002
Dementsprechend auch
10.7999999999999999 ist gleich
10.800000000000001
Ich hoffe das stellt klar was mein problem damit ist zu versuchen gleitkommazahlen zu runden.
Das rundet java aber automatisch auf 10.8.
Du verstehst es nicht, oder? Die gerundete Zahl steht in einer temporären Variable, während die eigentliche Zahl untouched noch in der ursprünglichen Variable steht.
Ob Java das jetzt für mich automatisch rundet oder nicht, wenn ich 10.8 in der Ausgabe stehen habe, ist es mir (mit Verlaub:) scheißegal, ob in der Variable tatsächlich noch ein Milliardstel übrig bleibt oder nicht.
Was ist also dein Problem? Dass du klugscheißen musst, obwohl das nicht teil der Frage war? Der Fragensteller hat nicht geschrieben, wofür er die gerundete Zahl braucht, er wollte nur eine gerundete Zahl haben.
Hat er bekommen. Alles klar? Super!
Hat er bekommen.
Zumindest bei zahlen unter zehn million. Bei denen dadrüber funktioniert dein code so nicht mehr weil java dann bei 10000000.751245 einfach 1.0000000751245E7 ausgibt, also nicht mehr rundet.
double zahl = 10000000.751245;
int nks = 1; //Anzahl Nachkommastellen
double faktor = Math.pow(10.0,nks);
int temp = (int) Math.round(zahl * faktor);
double roundOff = (double) temp/faktor;
System.out.println(roundOff);
Problem solved. Zufrieden oder immer noch Bedarf an dieser unnötigen, total bescheuerten Diskussion?
Warum unnötig? Dein Code hat nicht richtig funktioniert, jetzt schon, also anscheinend sinnvoll.
Mein Code hat funktioniert, da keinerlei Spezifikationen angegeben waren.
Naja, "einen Double" heißt für mich einen beliebigen Double.
Aber klar, kann man auch definieren als genau einen Double, also dass das Programm genau eine bestimmte Zahl runden kann.
Bzw. bis zu einem Spektrum alles runden kann. Denn wenn die Zahl sehr groß ist, ist die Differenz marginal klein welches als Rundungsdifferenz rauskäme im Verhältnis.
Man muss es nicht übertreiben. Wenn er irgendwelche professionelle Software schreiben würde, wo es darauf ankäme, müsste er die Frage nicht stellen.
Einfach die 5 nachkommastellen abschneiden und nur eine ausgeben