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.
ich habe eine kurze Frage es geht bei den folgenden Bereichen um den kleinstmöglichen Datentypen:
510.33 bis 10012.61 = Datentyp float
0.987543219 bis 1 = Datentyp float
-10 bis 3243231231 = Datentyp long
Wenn man die Zahlen 510.33 bis 10012.61 immer auf zwei Nachkommastellen gerundet haben möchte bzw. gerundet ausgibt, dann float, ja.
Die Zahl 0.987543219 lässt sich allerdings in dieser Präzision nicht als float darstellen. Siehe auch https://www.h-schmidt.net/FloatConverter/IEEE754.html
Die nächste auf 9 Stellen gerundete repräsentierbare float Zahl wäre 0.987543225.
Hier brauchst du double.
Ich würde aber immer empfehlen, mit Ganzzahltypen zu arbeiten und erst für die Ausgabe umzuwandeln und zu runden.
Noch als allgemeiner Hinweis: Ein großer Vorteil bei so Aufgaben ist, dass man es auch direkt ausprobieren kann. Du kannst also ein kleines Programm schreiben um zu schauen, ob die Werte in entsprechenden Variablen gespeichert werden können und durch eine einfache Ausgabe siehst du, ob die Werte wirklich korrekt sind.
Durch das selbst ausprobieren merkst Du Dir die Dinge dann auch deutlich besser.
Schöne Sonntagsfrage. try and error geht zwar auch, würde ich aber nicht bevorzugen.
Java:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Precision {
// Gibt die minimale Anzahl der Nachkommastellen zurück, mit denen alle Werte im angegebenen Intervall [from, to] exakt dargestellt werden können.
// Beispiel: [500, 600] -> 13 und [50000, 60000] -> 7
int getPrecisionInRange(float from, float to) {
int precision = 100;
float f = from;
while (f <= to) {
float n1 = Math.nextAfter(f, Float.POSITIVE_INFINITY);
float n2 = Math.nextAfter(n1, Float.POSITIVE_INFINITY);
BigDecimal b0 = new BigDecimal(f);
BigDecimal b1 = new BigDecimal(n1);
BigDecimal b2 = new BigDecimal(n2);
BigDecimal b3 = b0.add(b2)
.divide(BigDecimal.valueOf(2), RoundingMode.HALF_UP);
if (b3.compareTo(b1) != 0) {
int p = b3.scale();
if (p < precision) {
precision = p;
}
}
f = n1;
}
return precision;
}
}
Nur um deutlich zu machen, was ich meinte bezüglich ausprobieren:
Bezüglich des Float Wertes könnte man einfach ausprobieren:
Java:
float f = 0.987543219f;
System.out.println("Float: " + f);
Dann sieht man eine Ausgabe: Float: 0.9875432
==> Float kann die zahl somit nicht abbilden, da die letzten zwei Ziffern abgeschnitten werden.
Bei dem long wäre die Frage: Tut es evtl. schon ein int? Also versuchen wir es: int i = 3243231231;
Hier brauchen wir auch keine Ausgabe, denn das übersetzt nicht einmal.