Java: Doppel vs Schwimmer
-
16-09-2019 - |
Frage
In einer anderen Bruce Eckel Übung, der Code, den ich geschrieben habe, dauert ein Verfahren und Änderungen Wert in einer anderen Klasse. Hier ist mein Code:
class Big {
float b;
}
public class PassObject {
static void f(Letter y) {
y.c = 'z';
} //end f()
static void g(Big z) {
z.b = 2.2;
}
public static void main(String[] args ) {
Big t = new Big();
t.b = 5.6;
System.out.println("1: t.b : " + t.b);
g(x);
System.out.println("2: t.b: " + t.b);
} //end main
}//end class
Es wirft eine Fehlermeldung, „Möglicher Verlust an Präzision.“
PassObject.java:13: possible loss of precision
found: double
required : float z.b = 2.2
passobject.java:20: possible loss of precision
found : double
required : float t.b = 5.6
Kann double
s nicht float
s als auch sein?
Vielen Dank im Voraus
Lösung
Ja, aber Sie müssen angeben, dass sie Schwimmer sind, sonst werden sie als verdoppelt behandelt:
z.b = 2.2f
Die ‚f‘ am Ende der Nummer macht es einen Schwimmer anstelle ein Doppel.
Java wird nicht automatisch ein Doppel verengt mit einem Schwimmer.
Andere Tipps
Nein, kann Schwimmer automatisch sein upcast zu verdoppelt, verdoppelt aber nie Schwimmer ohne explizites Casting, weil verdoppelt die größere Reichweite hat.
Schwimmerbereich 1.40129846432481707e-45
bis 3.40282346638528860e+38
Doppel Bereich ist 4.94065645841246544e-324d
bis 1.79769313486231570e+308d
standardmäßig Java wird eine Dezimalzahl (zum Beispiel „4.3
“) als double
behandeln, wenn Sie sonst ein float
angeben, indem Sie ein f nach der Nummer Zugabe (beispielsweise „4.3f
“).
Sie sind mit dem gleichen Problem auf beiden Leitungen. Zuerst wird das Dezimalsystem wörtliche als Doppel vom Compiler interpretiert. Dann versucht es, zuzuordnen b
, die vom Typ float
ist. Da ein double
64 Bits und ein float
ist nur 32 Bits (siehe Java Primitive Dokumentation ), Java gibt Ihnen einen Fehler anzeigt, dass der float
nicht innerhalb des double
passen. Die Lösung ist eine f auf Ihre Dezimal Literale hinzuzufügen.
Wenn Sie das Gegenteil zu tun versuchen, (d zuordnen float
zu einem double
), das wäre in Ordnung, da Sie 32 Bits ein float
die passen in einem double
des 64.
Verwenden Sie Schwimmer nicht. Es gibt so gut wie nie ein guter Grund, es zu benutzen und ist seit mehr als einem Jahrzehnt nicht mehr. Verwenden Sie einfach doppelt.
can't doubles be floats as well?
Nein. Jeder Wert oder eine Variable hat genau einen Typ (double, float, int, lang, etc ...). Die Java Language Specification Staaten genau das, was passiert, wenn Sie versuchen, einen Wert von einem Typ einer variablen eines anderen Typs zuzuweisen. Im allgemeinen Zuweisungen eines „kleineren“ Wert auf einen „größeren“ Typ erlaubt sind und implizit getan, aber Aufgaben, bei denen Informationen verloren gehen könnten, weil der Zieltyp zu „klein“ ist, alle Werte des Ursprungstyps zu halten, werden nicht durch die erlaubte Compiler, auch wenn der konkrete Wert paßt in den Zieltyp.
Das ist, warum der Compiler beschwert sich, dass eine doppelte Wert zuweisen (was die wörtliche implizit ist) mit einem Schwimmer variablen Informationen verlieren könnte, und haben Sie es besänftigen, indem Sie entweder den Wert ein Schwimmer machen, oder explizit durch Gießen.
Ein Bereich, der oft Verwirrungen verursacht, sind Berechnungen, da diese implizit „erweitert“ aus technischen Gründen in int. Also, wenn Sie zwei Shorts multiplizieren und versuchen, das Ergebnis zu einer kurzen zuweisen, der Compiler wird sich beschweren, weil das Ergebnis der Berechnung ist ein int.
Schwimmerbereich ist niedriger als doppelt so kann ein Schwimmer leicht in Doppel dargestellt werden, aber das Gegenteil ist nicht möglich, weil sie sagen, dass wir einen Wert annehmen, die dann während der Konvention aus Schwimmerbereich ist, werden wir die genauen Daten verlieren