Announcement

Collapse
No announcement yet.

typecast

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • typecast

    hallo! <br>

    funktioniert folgender maßen ein typecast in java?<br>
    <br>
    long ergebnis<br>
    ergebnis = (long) Math.sqrt(0.54);<br>
    <br>
    wie ist die allgemeine regel für typecasting in java!<br>

    gruß

    markus
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Generell: Ja. Aber Du hast Dir ein schlechtes Beispiel ausgesucht <p>
    Generell gibt es zwei Arten von Typecasting: Erweiterndes Casting und einschraenkendes Casting. Die erweiternde Konvertierung ist z.B. eine Umwandlung von int in long, wenn also der neue Typ auf jeden Fall den alten Typ aufnehmen kann (und es keine Probleme gibt), oder von float auf double. Dagegen ist - wie in Deinem Beispiel - eine einschraenkende Konvertierung mit einem Genauigkeitsverlust oder mit "Abschneiden ueberzaehliger Stellen" verbunden: Wenn Du den Wert 200 in ein byte umformst, hast Du nur noch 127 - das ist der maximale Wert fuer byte.<p>
    Bei Objekten (genauer: Referenztypen) gibt es auch die Unterteilung zwischen erweiternde (von einem Objekt auf eine seiner Vaterklassen) oder einschraenkende (von einer Vaterklasse auf eine spezielle Kind-Klasse). Besonders beim Arbeiten mit Vector merkt man dies: Ein Vector kann zwar als Element ein beliebiges Objekt speichern, nach dem Abruf muss man es aber "per Hand" durch ein Casting wieder in das urspruengliche Objekt umformen:<pre>
    Vector v = new Vector();
    Color blue = new Color(0, 0, 255);
    v.add(blue); // Farbe sichern
    // geht nicht, weil das Element keine Farbe ist
    setBackground(v.get(0));
    // geht, weil das Element aus dem Vector ERST wieder in ein
    // Color-Objekt konvertiert wird und DANN in setBackground
    // verwendet wird
    setBackground( (Color)v.get(0) );
    </pre><p>
    Nun zu Deinem Beispiel und warum ich es fuer schlecht halte: Das Umformen von Gleitkommazahlen in Ganzzahlen kann man mit Runden besser in Griff bekommen als mit einem Typecast, da werden schlichtweg die Nachkommastellen abgeschnitten. So wird aus sqrt(0.54) 0, obwohl es mit 0.73 eher 1 waer. Dafuer gibt es in der Bibliothek Math Rundungsfunktionen.<p>
    Die Moral beim Typecasting: Wenn man in einen Wertebereich "herunterkonvertiert", der vielleicht den Zahlenwert veraendert (ungenau, zu kleiner Wertebereich), dann sollte man ganz genau ueberlegen, ob es keine Folgefehler gibt.<p>
    Gruss, Marc

    Comment


    • #3
      vielen dank marco
      Herzliche Grüße

      Markus Lemcke
      barrierefreies Webdesign

      Comment


      • #4
        <HTML>
        <PRE>
        Na ja das mit der Nach oben Konvertierung ist so ne Sache

        float fValue = 3.2f;
        double dValue = 2.0d
        double dErgebnis = 0.0d;

        dErgebnis = dValue + (double)fValue;
        System.out.println("dErgebnis="+derg);

        ergibt die Ausgabe:dErgebnis=5.200000047683716

        na ja wenn man da meint man rechnet ja in double und will auf dem Mond landen.
        Denke nur an Differentialrechnung und Anfangswertprobleme
        <BR><BR>
        Eine float-Variable wird in Java abgebildet in 4 Byte bzw. 32 Bit.
        Von den 32 Bit wird 1 Bit fuer das Vorzeichen und 8 Bit für den
        Exponenten verwendet. Für die Mantisse (binaerer Zahlenwert!)
        bleiben somit 23 Bit. 2 hoch 23 ergibt 8388608 (wenn ich mich nicht verrechnet habe).
        Das bedeutet, dass eine float-Zahl intern nur eine Genauigkeit von 7 Dezimalziffern gewährleisten kann.
        das bedeutet, dass die 7.Stelle gerundet noch richtig ist.
        Alle weiteren Stellen entstehen durch den cast auf double und sind deshalb nicht mehr exakt.

        Ergo wenn man double braucht immer in double rechnen fuer alle Variablen
        </PRE>
        Gruß Roli
        </HTML&gt

        Comment


        • #5
          danke
          Herzliche Grüße

          Markus Lemcke
          barrierefreies Webdesign

          Comment

          Working...
          X