Fließkommazahlen: Das double-Keyword

Video

Mit dem Laden des Videos akzeptierst du die Datenschutzerklärung von YouTube. Wenn du die Menge an Daten reduzieren möchtest, die YouTube von dir sammelt, solltest du dich vorher aus deinem YouTube-Account ausloggen, das Speichern von Cookies für das Google-Ads-Programm deaktivieren und/oder Cookies im Browser blockieren.

YouTube immer automatisch laden
Inhaltsverzeichnis
Als Text lesen

Du kennst bereits die Basistypen int und boolean. In boolean-Variablen können lediglich Wahrheitswerte gespeichert werden, und in int-Variablen Ganzzahlen. Um mit Fließkommazahlen hantieren zu können, gibt es das double-Keyword:

double x = 1.4142;
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Hierbei werden alle Stellen nach dem Komma durch einen Punkt getrennt.

doubles können ähnlich wie int-Werte miteinander verrechnet werden, mit Ausnahme der Division, bei der hier nicht mehr abgerundet wird:

double a = 12.0;
double b = 3.5;
double d0 = a + b; // 15.5
double d1 = a - b; // 8.5
double d2 = a * b; // 42.0
double d3 = a / b; // 3.4285714285714284
double d4 = a % b; // 1.5
boolean b0 = a < b; // false
boolean b1 = a <= b; // false
boolean b2 = a >= b; // true
boolean b3 = a > b; // true
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Achtung! Vergleiche niemals, niemals, niemals double-Werte mit == bzw. !=. Den Grund hierfür liefert folgendes Beispiel:

Die Berechnung 1.6 + 1.8 sollte eigentlich 3.4 ergeben. Allerdings ist das tatsächliche Ergebnis 3.4000000000000004. Ein Vergleich mit == würde hier false liefern!

Das liegt an der Art und Weise, wie Fließkommazahlen in Binärdarstellung gespeichert werden. Für dich ist die genaue Funktionsweise irrelevant, aber merke dir stets dass Fließkommazahlen fehlerbehaftet sind!

Es ist besser, doubles mit Fehlertoleranz zu vergleichen:

double res = 1.6 + 1.8;
if (res > 3.399 && res < 3.401) {
// ...
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Im Gegensatz zu int liefert eine Division durch 0.0 bei doubles keinen Fehler, sondern abhängig vom Dividenden sonderbare Ergebnisse:

  • 1.0 / 0.0 ergibt Infinity, weil der Dividend 1.0 positiv ist
  • -1.0 / 0.0 ergibt -Infinity, weil der Dividend -1.0 negativ ist
  • 0.0 / 0.0 ergibt NaN (Not a Number), weil der Dividend 0.0 ist

Infinity, -Infinity, und NaN sind zwar mathematisch gesehen keine Zahlen, wurden aber trotzdem als double-Konstanten definiert. Auch bei anderen Operationen als / kann es u.A. bei Falscheingaben zu solchen Ergebnissen kommen.

Übersicht Bisherige Basistypen

Basistyp Art Beispiele
boolean Wahrheitswert false, true
int Ganzzahl -10, 0, 7, 42, 9999
double Fließkommazahl -1.125, 0.0, 3.14159, Double.NaN, Double.NEGATIVE_INFINITY

Weil bestimmte mathematische Funktionen und Konstanten sehr häufig benötigt werden, gibt es diese bereits in der Standard-Java-Bibliothek:

double pi = Math.PI; // 3.141592653589793
double euler = Math.E; // 2.718281828459045
double a = Math.sqrt(9.0); // Die Quadratwurzel aus 9.0 ist 3.0
double b = Math.pow(2.0, 3.0); // 2.0 hoch 3.0 ist 8.0
double c = Math.sin(pi / 2.0); // Sinus von pi / 2.0 ist 1.0
double d = Math.abs(-10.0); // Der absolute Wert (Betrag) von -10.0 ist 10.0
double e = Math.min(1.5, 1.7); // Der kleinere der beien Werte ist 1.5
double f = Math.max(1.5, 1.7); // Der größere der beiden Werte ist 1.7
// Und noch viele weitere...
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Du kennst doch sicher die Mitternachtsformel aus dem Mathe-Unterricht:

solution_formula.svg

Falls das jetzt komplettes Neuland für dich ist: Kein Problem! Es ist für diese Aufgabe nicht wichtig zu verstehen, was passiert. Du sollst lediglich die obige Formel in Programmcode umwandeln.

Das ± bedeutet, dass es zwei Ergebnisse gibt, eines für -b + ..., und eines für -b - .... Gib beide Lösungen wie folgt aus: Die beiden Nullstellen der Parabel lauten FIRST_SOLUTION und SECOND_SOLUTION.

Online Editor

Mit dem Laden des Online Editors akzeptierst du die Datenschutzerklärung von JDoodle, einem Produkt der Nutpan pty Ltd (Australien). JDoodle verwendet die Tools reCAPTCHA und Google Analytics, wodurch Daten an Google übertragen werden können. Ich habe leider keinen Einfluss auf diesen Prozess. Du kannst Google Analytics über ein Browserplugin deaktivieren.

Online Editor immer automatisch laden

Das Ergebnis für das gegebene Beispiel sollten die Nullstellen 1.5 und -2.0 sein.

Was passiert für die Eingaben a = 1.0, b = 0.5, c = 3.0? Modifiziere deinen Code so, dass stattdessen eine Fehlermeldung ausgegeben wird.

Häufige Fehlerquellen
  • Klammern vergessen: Punkt vor Strich und so
  • Vorzeichenfehler
  • b² falsch implementiert: Verwende entweder b * b oder Math.pow(b, 2.0)
Lösungsvorschlag
public class QuadraticFormula {
public static void main(String[] args) {
// 1x² + 0.5x - 3
double a = 1.0;
double b = 0.5;
double c = -3.0;
// Zuerst alles unter der Wurzel berechnen
double discriminant = Math.pow(b, 2.0) - 4.0 * a * c;
if (discriminant < 0.0) {
/*
* Falls der Teil unter der Wuzel negativ ist,
* gibt es keine reellen Lösungen.
*/
System.out.println("Es gibt keine (reellen) Lösungen");
} else {
// Ergebnis der Wurzel ausrechnen
double root = Math.sqrt(discriminant);
// Beide Ergebnisse ausrechnen
double firstSolution = (-b + root) / (2.0 * a);
double secondSolution = (-b - root) / (2.0 * a);
System.out.println("Die beiden Nullstellen der Parabel lauten " + firstSolution + " und " + secondSolution + ".");
}
}
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Dir gefällt meine Arbeit?

Unterstütze Mich
AllgemeinSocialRechtliches
HomeInstagramDatenschutz
ÜberYouTubeImpressum
TikTok
Ko-fi

Made with love by a former noob.

© 2022-2024 Timo Friedl