Java double 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.


Jacky881 
Beitragsersteller
 04.01.2022, 15:19

Einfach die 5 nachkommastellen abschneiden und nur eine ausgeben

jort93  04.01.2022, 15:26
@Jacky881

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);
jort93  04.01.2022, 15:32
@jort93

Wenn du nicht runden willst, sondern die nachkommastellen abschneiden, könntest du mit String.indexOf() nach dem dezimalpunkt/komma suchen und es dann mit String.substring() die zahlen danach abschneiden abschneiden.

Aber überleg dir erstmal was du überhaupt willst.

ralphdieter  04.01.2022, 16:34
@jort93
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.

jort93  04.01.2022, 16:43
@ralphdieter

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.

jort93  04.01.2022, 16:51
@ralphdieter

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.


jort93  04.01.2022, 15:43

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.

GuteAntwort2021  04.01.2022, 19:32
@jort93
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.

jort93  04.01.2022, 20:13
@GuteAntwort2021

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.

jort93  04.01.2022, 20:35
@jort93

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.

GuteAntwort2021  05.01.2022, 00:06
@jort93
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!

jort93  05.01.2022, 00:14
@GuteAntwort2021
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.

GuteAntwort2021  05.01.2022, 00:21
@jort93
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?

jort93  05.01.2022, 00:23
@GuteAntwort2021

Warum unnötig? Dein Code hat nicht richtig funktioniert, jetzt schon, also anscheinend sinnvoll.

jort93  05.01.2022, 00:37
@GuteAntwort2021

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.

GuteAntwort2021  05.01.2022, 01:01
@jort93

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.