BigDecimal.setScale spinnt

Ich hab bei meinen Spielereien gerade ein ziemlich heftiges Problem:

		double d1 = 11.7;
		float f1 = (float) d1;
		double d2 = f1;
		double d3 = BigDecimal.valueOf(d2).setScale(1, RoundingMode.DOWN).doubleValue();
		System.out.println(d1);
		System.out.println(f1);
		System.out.println(d2);
		System.out.println(d3);

Die Ausgabe ist:

11.7
11.7
11.699999809265137
11.6

Das Problem ist, zwischen 11.7 und 11.6 liegen fast 1%, und dieser Folgefehler zieht sich durch mehrere Berechnungen durch (akkumuliert sich). Es MUSS im Normalfall abgerundet werden.

Wie vermeide ich das (am besten)? :sunglasses:

In solchen Fällen wird gerne auf

https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

verweisen. Wer sich anmaßen will, das gelesen zu haben, möge sich bei mir melden. Wer sich anmaßen will, das verstanden zu haben, nicht.

Ansonsten ist die Frage ziemlich sinnlos: „Ich runde ab, und das ist falsch, aber ich muss abrunden, was soll ich nur tun?“.

Ok, Sorry, das war ungünstig formuliert… Ich möchte, dass .8 zwar abgerundet wird, .9 (und alles darüber) jedoch aufgerundet wird.

Hab einen Hinweis auf SO bekommen (bevor meine Frage wegen einer schlecht gewählten Überschrift geschlossen wurde…) Einfach .001 oder .0001 addieren und dann runden. Nur, woher weiß ich, wie klein ich den 1. Summanden wählen muss?

Die „Darstellungsungenauigkeit“ (ich denke, das nennt man so - oder Rundungsfehler(?)) scheint ja bei der einengenden Konvertierung von float nach double aufzutauchen, oder spätestens bei der anschließenden Zurück-Konvertierung in double oder bei der Ausgabe.

Als temporären Workaround alles auf double umzustellen (oder eben alles auf float), scheint auch zu funktionieren.

Aber es scheint wohl alles einen Sinn zu haben, dass es zum Beispiel jede Math-Funktion sowohl für float wie auch für double gibt.