In diesem Notebook schauen wir uns vier grundlegende Datentypen von Java an. Sie lernen:
Sie haben den Unterschied zwischen ganzen Zahlen und Gleitkommazahlen in Java kennen gelernt. Dafür haben Sie bisher int
und double
verwendet. In Java gibt es aber noch den Datentpen long
für ganze Zahlen, dessen Wertebereich grösser ist als der von int
. Bei den Gleitkommazahlen gibt es noch den Datentypen float
, welche die Zahlen weniger genau darstellt als double
.
Entscheidungskriterien
int
. Verwenden Sie long
wenn der Wertebereich von int
nicht gross genug ist.double
. Verwenden Siefloat
wenn der Speicher zu begrenzt ist.byte
und short
, welche ganze Zahlen nur in einem kleineren Bereich als int
darstellen können.)Um einen Zahlwert als long
zu kennzeichnen, folgt nach der ganzen Zahl der Buchstabe l
(kleines L
).
1l
9876543210l
Um einen Zahlenwert als float
zu kennzeichnen, folgt nach dem Zahlwert der Buchstabe f
.
1f
-2.345f
3.1415e-3f
long
und float
.float
einer Variable vom Typ double
zu.long
einer Variable vom Typ int
zu.public class Values {
public static void main(String[] args) {
// Ihre Lösung kommt hier hin
}
}
Values.main(new String[0]);
Auf den Wertebereiche der Datentypen bezogen gilt: $$ int \subset long \subset float \subset double$$
In Java ist die Zuweisung eines Wertes an eine Variable des gleichen oder mächtigeren Datentyps erlaubt.
In Java gibt es definierte Konstanten welche den Wertebereich der jeweiligen Datentypen angeben.
Vorsicht: Die Konstanten mit dem selben Namen können für unterschiedliche Typen etwas anderes bedeuten. Dies könnte ein Hinweis auf nicht so guten Programmierstil sein.
Konstanten welche den Wertebereich angeben sind:
Typ | Konstante | Bedeutung |
---|---|---|
int | Integer.MAX_VALUE | grösster, darstellbarer Wert |
int | Integer.MIN_VALUE | kleinster, darstellbarer Wert |
long | Long.MAX_VALUE | grösster, darstellbarer Wert |
long | Integer.MIN_VALUE | kleinster, darstellbarer Wert |
float | Float.MAX_VALUE | grösster, darstellbarer Wert |
float | Float.MIN_VALUE | kleinster, positiver, darstellbarer Wert |
double | Double.MAX_VALUE | grösster, darstellbarer Wert |
double | Double.MIN_VALUE | kleinster, positiver, darstellbarer Wert |
public class Range {
public static void main(String[] args) {
System.out.println("int stellt Zahlen von " +
Integer.MIN_VALUE + " bis " +
Integer.MAX_VALUE + " dar.");
System.out.println("Dies ist in etwa +- 2 Milliarden.");
System.out.println("long stellt Zahlen von " +
Long.MIN_VALUE + " bis " +
Long.MAX_VALUE + " dar.");
System.out.println("Dies ist in etwa +- 9 Trillionen.");
System.out.println("float stellt Zahlen von " +
(-Float.MAX_VALUE) + " bis " +
Float.MAX_VALUE + " dar.");
System.out.println("double stellt Zahlen von " +
(-Double.MAX_VALUE) + " bis " +
Double.MAX_VALUE + " dar.");
System.out.println(Float.MIN_VALUE + " ist nur etwas grösser als 0.0f.");
System.out.println(Double.MIN_VALUE + " ist nur etwas grösser als 0.0.");
}
}
Range.main(new String[0]);
Welchen der vier Typen würden Sie bei den folgenden Aufgabenstellungen verwenden?
Für diesen Kurs gilt in der Regel: Wenn nichts spezielles steht, nehmen Sie entweder double
oder int
. Dabei verwenden wir double
für Messgrössen und int
für Zählgrössen.
Der Speicherbedarf wird gemessen, indem man die zum Speichern benötigten Bits, also die Anzahl Nullen und Einsen, angibt. Den Speicherbedarf können Sie für int
, long
, float
und double
mit Hilfe von in Java definierten Konstanten heraus finden.
Die Konstanten welche den Speicherbedarf angeben sind:
Typ | Konstante |
---|---|
int | Integer.SIZE |
long | Long.SIZE |
float | Float.SIZE |
double | Double.SIZE |
public class MemoryFootprint {
public static void main(String[] args) {
System.out.println("int belegt " + Integer.SIZE + " Bits im Speicher.");
System.out.println("long belegt " + Long.SIZE + " Bits im Speicher.");
System.out.println("float belegt " + Float.SIZE + " Bits im Speicher.");
System.out.println("double belegt " + Double.SIZE + " Bits im Speicher.");
}
}
MemoryFootprint.main(new String[0]);
Variablen die ihren Wert nicht ändern sollen können mit dem Schlüsselwort final
gekennzeichnet werden.
Beispiele:
Namenskonvention: ALL_CAPITAL_LETTERS
public class ConstantValues {
public static void main(String[] args) {
final int MAX_LENGTH = 12;
System.out.println(MAX_LENGTH + " und " + Math.PI + " sind Werte von Konstanten.");
}
}
ConstantValues.main(new String[0]);
Berechnen Sie die Lösung für die folgende Aufgabe und geben Sie die Zahl aus.
public class GardenFence {
public static void main(String[] args) {
// Ihre Lösung kommt hier hin
}
}
GardenFence.main(new String[0]);
Beim Type-Casting schreibt man den Typ der Variablen in runden Klammern vor den Ausdruck der umgewandelt werden soll.
Achtung: Das Umwandeln mit Type-Casting kommt meist auch mit einer gewissen Ungenauigkeit. Nachkommastellen werden einfach abgeschnitten.
Schema
(<TYPE>) <AUSDRUCK>
Beispiele
(int) 2.0
(float) 3.1415
(long) (5.6 * 2.1)
int
berechnet und dann ausgegeben wird.public class TypeCasts {
public static void main(String[] args) {
// Ihre Lösung kommt hier hin
}
}
TypeCasts.main(new String[0]);
Die Genauigkeit von Zahlen im Computer ist Beschränkt. Nicht nur beim Type-Casting können so Fehler entstehen. Wir schauen uns nun drei Rechnungen an wo nur die Addition verwendet wird. Werden wir die erwarteten Resultate erhalten.
Addieren Sie dreimal die Zahl 0.1 zueinander und geben das Resultat auf die Konsole aus.
public class Summation {
public static void main(String[] args) {
// Ihre Lösung kommt hier hin
}
}
Summation.main(new String[0]);
Mathematisch gibt die folgende Formel für positive, ganze Zahlen immer 1: $$\sum\limits_{i=1}^{N}\frac{1}{N}$$
public class Summation2{
public static void main(String[] args) {
double result = 1.0 / 6.0 + 1.0 / 6.0 + 1.0 / 6.0 +
1.0 / 6.0 + 1.0 / 6.0 + 1.0 / 6.0;
System.out.println("Erwartet 1.0, tatsächlich " + result);
}
}
Summation2.main(new String[0]);
Dies zeigt, der Computer rechnet dies aus und löst die Aufgabe nicht irgendwie algebraisch.
Nachfolgend sehen Sie ein Beispiel einer Aufgabe in einem Lernsetting. Es geht darum drei Zahlen zu Summieren.
public class Summation3 {
public static void main(String[] args) {
double a = 13.0;
double b = Math.PI;
double c = 21.45;
double solution_student = a + b + c;
System.out.println("The solution of the student is: " + solution_student);
double solution_teacher = a + c + b;
System.out.println("The solution of the teacher is: " + solution_teacher);
}
}
Summation3.main(new String[0]);
Diese Beispiele zeigen, dass man bei Gleitkommazahlen immer aufpassen muss mit der Genauigkeit.
Dies wird später im Kurs vorallem auch beim Testen von Programmen erneut wichtig.
float
werden mit 32 Bits dargestellt. Mit 32 Bits lassen sich $2^{32}$ unterschiedliche Werte darstellen.float
eine Genauigkeit von 6 oder 7 signifikanten Dezimalstellen, für double
sind es 14 bis 15 signifikante Dezimalstellen.Interessierte finden eine ausführlichere und detailliertere Diskussion rund um die Darstellung und Genauigkeit von float
hier.
int
, long
, float
, double