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 doubles nicht floats als auch sein?

Vielen Dank im Voraus

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top