Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
in meinem Programm habe ich im Moment float-Werte die sich extrem seltsam verhalten. An bestimmten Stellen erhöhe oder verringer ich diese um Werte zwischen 0.1f und 0.01f.
Wenn ich mir die Werte jedoch Ausgeben lasse bekomme ich etwas wie 0.10000706, also Werte die ganz leicht von meinen abweichen. Jedoch habe ich meine floats nie in so kleinen Schritten initialisiert oder verändert ...
Kann mir das jemand erklären und evt. ein Lösung dafür anbieten? Der kleine aber feine Unterschied zwischen 0 und 1e-7 macht mir nämlich gerade ziemlich große Probleme!
Der Codeabschnitt ist aber leider relativ komplex und tief in meinem Programm ... das ist nicht so einfach den mal "als erstes" zu posten. Vielleicht kann mir jemand auch ohne das einen Hinweis geben.
float (und double) sind Gleitkommazahlen, dass heisst sie können garnicht alle Zahlen in ihrem Zahlenbereich abbilden. Das spart zwar sehr viel Speicherplatz und Performance im Vergleich zu anderen Datentypen, bedeuted aber auch das sie nicht immer korrekt sind. Wenn du exakte Rechnungen mit Kommazahlen brauchst benutz bspw. BigDecimal.
Um ehrlich zu sein, ist das eine gute Frage. Diese x.0000000012 verstehe ich nicht.
Wenn diese Zahlen nicht darstellbar wären, wieso geht dann folgendes:
Java:
public static float round(float f, int precision) {
float i = (float) Math.pow( 10, precision );
return (int) ( f * i ) / i;
}
public static void main(String... args) {
float f = 10f - 1.06f; // eigentlich 8.94
System.out.println( f ); // 8.940001
System.out.println( round( f, 2 ) ); // 8.94
}
Die Zahl ist schon darstellbar. Wie Fließkommazahlen allerdings addiert und subtrahiert werden, ist keine triviale Angelegenheit. Es kann sogar präziser multipliziert und dividiert werden. Deshalb auch die Ausgabe
Das geht, weil sich 8.94 halt doch darstellen lässt, sich aber der Rechner bereits beim Berechnen von 10 - 1.06 verhauen hat. Die beiden Zahlen haben verschiedene Exponenten und dass bedeutet, dass die eine auf den Exponenten der anderen gebracht werden muss. Dabei entstehen nicht selten schon die ersten Rundungsfehler, z.B. wenn sich eine Zahl nur als endloser Bruch im Exponentenbereich der anderen darstellen lässt.
z.B. 16 und 9 in den Exponentengruppen 2 und 4