Runden - x/100 liefert long zurück

Status
Nicht offen für weitere Antworten.

oetzi

Bekanntes Mitglied
Hallo zusammen,

ich machs kurz.
Warum liefert mir der Code hier:
Java:
        a = 90.0;

        System.out.println("a:"+a);
        b = (a/55);
        System.out.println("a/55:"+b);
        b = b * 100;
        System.out.println("*100:"+b);
        b = (Math.round(b))/100;

diesen Fehler:
found : long
required: java.lang.Double

okay, Math.round() liefert mir nen long Wert, aber wenn ich den durch 100 rechne, müsste doch eigentlich ein double bei raus kommen oder?

was ist mein Denkfehler hier?

Gruß
oetzi
 
Zuletzt bearbeitet:
Nabend Michael,

mhpf, habe quasi zufällig, als ich dir gerade antworten wollte, den Fehler gefunden.
ich hatte a und b bis jetzt als "Double" statt als "double" deklariert.
Jetzt muss ich doch direkt mal fragen wo da der Unterschied ist.
Ich dachte die Klasse Double wäre nur eine Art Wrapper für den primitiven Datentyp, der mir ein paar Methoden zur Verfügung stellt?!?

Naja, und eine Sache funktioniert leider immer noch nicht.
Hier mal der aktuelle Code:

Java:
package testapp;

public class Main {

    public static void main(String[] args) {

        double a,b;
        a = 90.0;

        System.out.println("a:"+a);
        b = (a/55);
        System.out.println("a/55:"+b);
        b = b * 100;
        System.out.println("*100:"+b);
        b = Math.round(b);
        System.out.println("round:"+b);
        b = (b/100);
        System.out.println("/100:"+b);
        
        double c = 90.0;        
        System.out.println("direkt:"+(Math.round((c/55)*100))/100);
    }

}

Die Ausgabe sieht so aus:
a:90.0
a/55:1.6363636363636365
*100:163.63636363636365
round:164.0
/100:1.64 <-- Das soll rauskommen
direkt:1 <-- warum ist das = 1??

Warum liefert mir die letzte Zeile eine 1 statt der 1.64??
Ich habe jetzt mehrmals die Klammern überprüft. Übersehe ich da irgendwas?

Gruß
oetzi
 
wenn du /100.0 machst kommt auch ein Komma zahl raus.



Wie du sagst ist der Rückgabetyp von Math.round ein Long.

wenn du einen Long durch einen Int dividierst kommt wieder ein Int bzw. long zurück daher 1

wenn du aber einen double durch einen int dividierst kommt ein double zurück. oder du machst 100 zu 100.0 so ist dies dann auch ein double
 
Morgen AmunRa,

danke für die Erklärung.

Trotzdem muss ich gestehen, dass ich nicht ganz verstehe, warum die Zeilen 12-19 was anderes liefern wie die Zeile 22. Hatte ja einfach probiert alles hintereinander zu packen.

mhh, kann der Grund dafür sein, dass in Zeile 16 ein "stilles" Typcasting stattfindet? Man sieht ja in der Ausgabe, dass Zeile 17 "round:164.0" zurück gibt, obwohl ich in Zeile 16 ein Long zurück kriege.

Naja, auf jedenfall funktioniert es, wenn ich /100.0 rechne.

Schönen Gruß

oetzi

PS: Die Frage aus dem letzten Post war noch offen bzgl. des Unterschieds zwischen der KLasse Double und dem primitiven Datentyp double.

EDIT: typo
 
Zuletzt bearbeitet:
mhh, kann der Grund dafür sein, dass in Zeile 16 ein "stilles" Typcasting stattfindet? Man sieht ja in der Ausgabe, dass Zeile 17 "round:164.0" zurück gibt, obwohl ich in Zeile 6 ein Long zurück kriege.
b ist als double deklariert und kann ohne Probleme int und long entgegennehmen (mit eventuellem Genauigkeitsverlust) umgekehrt ist das eher schwieriger und eine Ganzzahl wird als Double mit x.0 dargestellt.
PS: Die Frage aus dem letzten Post war noch offen bzgl. des Unterschieds zwischen der KLasse Double und dem primitiven Datentyp double.
Die Antwort steckt ja schon in der Frage double ist ein primitiver Datentyp der nichts anderes kann als einen 64bit double Wert zu speichern. Double ist eine Klasse, die zum einen statische Methoden zum umgang mit double Werten bieten, zum anderen können Double Objekte instanziert werden, die intern einen double Wert speichern:
Double (Java 2 Platform SE 5.0)
 
...ich in Zeile 6 ein Long zurück kriege
...Du meinst Zeile 16, nw? b ist als double deklariert und wird deswegen auch wieder ein double, selbst wenn was anderes zurückgegeben wird.
In der Zeile 22 wird das zurückgegebene long aber nirgendwo mehr einem double zugewiesen, daher wird long verwendet und das Ergebnis ist dann auch ein long, weil keine weiteren Flieskommazahlen in die Rechnung einfliessen.
Double ist tatsächlich "nur" ein Wrapper für double. Da [c]Math.round()[/c] stets ein long liefert, welches im 1. Beispiel einer Variable des Typs Double, also einem Objekt, zugewiesen wird muss "geboxed" werden. Per Auto-Boxing wird aus dem zurückgegebenen long ein Long statt ein Double, welches sich nicht mehr in ein Double casten lässt.
 
Zuletzt bearbeitet von einem Moderator:
dank euch für eure Erklärungen!
Jetzt ist mir alles klar.

@spacerat:
Sehr interessant Erklärung zu der Double/double Frage.
Das gibt mir einen kleinen Einblick hinter die Kulissen 🙂

Schönen Gruß und schomal ein schönes Wochenende!

oetzi
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben