Rundung

crkn

Grünschnabel
Hi,

kann mir mal kurz wer sagen wieso bei:

Code:
		double v1 = 2E-5;
		double v2 = 1E-6;
		double v3 = v1 / v2;
		System.out.println("-> " + v3);

Code:
-> 20.000000000000004

anstatt 20.0 rauskommt?
 
Ich glaube, das hängt damit zusammen:

Code:
Schon einfache Dezimalzahlen, z. B. 0,1, können nicht mehr exakt als binäre Gleitkommazahlen
dargestellt werden, da viele im Dezimalsystem abbrechende Kommazahlen im Binärsystem
nicht abbrechende, periodische Zahlen sind; von diesen werden nur die ersten p Ziffern
gespeichert, wodurch Ungenauigkeit entsteht. Dezimal 0,1 ist binär 0,0001100110011… Man
kann aber zeigen, dass sich in einem binären Gleitkommasystem dennoch exakt 10 · 0,1 = 1 ergeben
muss.

Auf jeden Fall sind Gleitkommazahlen nicht 100% genau. Runden kann man per Math.floor, Math.round und Math.ceil.
 
Das liegt an der http://de.wikipedia.org/wiki/IEEE_754 Norm.

Kurz gesagt, auf Kosten der Genauigkeit wird größere bzw. niedrigere Zahlen dargestellt.

Wenn du daher wirklich eine genaue "Kommzahl" brauchst und du nicht einfach ein 64bit long oder 32bit int nehmen kannst (z.B. Würde ich bei Geldbeträgen auf Cent rechnen) dann brauchst du ein BigDecimal Object. Bei dem kann man einstellen, wie genau dieser sein soll.
 

Neue Beiträge

Zurück