int Berechnungen

NotAvailable

Neues Mitglied
Hallo, die folgenden beiden Methoden zeigen ein Verhalten, dass ich mir nicht wirklich erklären kann:

Java:
public static long addition () {
	return (12345 + 54321);
}

Gibt 17777 zurück und nicht wie erwartet 66666. Dabei scheint beim berechnen während des zurückgebens schief zu laufen. Führt man die Addition irgendwo anders durch funktioniert alls wie erwartet.

Java:
public static long divide () {
         final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
         final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;
         return ( MICROS_PER_DAY / MILLIS_PER_DAY );
}

Gibt 5 zurück. Was daran liegt, dass MICROS_PER_DAY als 500654080 statt 86400000000 berechnet wird. Das Problem ist dabei offenbar die letzte 1000. Teilt man das ganze auf und multipliziert statt mit 1000 3 mal nacheinander mit 10 klappts...

Kann mir das bitte jemand erklären? o_O
Danke schonmal.
 
Zuletzt bearbeitet von einem Moderator:

HoaX

Top Contributor
Beim ersten kommt 66666 raus, kopiere deinen Code und probier es aus! Der Trick bei deiner Aufgabenstellung ist, dass da nicht "54321" steht, sondern "54321l" (ein L statt einer 1 am Ende).

Bei zweiten tritt einfach eine Bereichsüberschreitung statt, weil die Zahl zu groß wird und nichtmehr von einem Integer dargestellt werden kann. Mach ein MICROS_PER_DAY = 24L * ... und es funktioniert.
 
S

SlaterB

Gast
der zweite Fehler ist ein int-Überlauf,
bei
Java:
    public static void main(String[] args)
    {
        final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
        System.out.println(MICROS_PER_DAY);
        int k = 24 * 60 * 60 * 1000;
        k *= 10;
        k *= 10;
        k *= 10;
        System.out.println(k);

    }
würde auch das 3x *10 nicht helfen,
da k kein long ist bleibt es bei int und simuliert die Gesamtrechung zuvor,
erst wird alles als int gerechnet, dann in long MICROS_PER_DAY abgespeichert

schreibe in der Rechnung am Anfang [c]24l[/c], dann wird alles als long gerechnet

edit: ok, wir haben hier Hausaufgaben, hab ich nicht erkannt, buuh ;)
 

NotAvailable

Neues Mitglied
Ich hatte es so gemacht:

public static void main(String[] args)
{
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
MICROS_PER_DAY = MICROS_PER_DAY * 10;
MICROS_PER_DAY = MICROS_PER_DAY * 10;
MICROS_PER_DAY = MICROS_PER_DAY * 10;
System.out.println(MICROS_PER_DAY);
}

und da gings dann natürlich doch... was wohl zusätzlich zu meiner Verwirrung beigetragen hat.
Aber nun is klar.
 

HoaX

Top Contributor
Ich hatte es so gemacht:

public static void main(String[] args)
{
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000;
MICROS_PER_DAY = MICROS_PER_DAY * 10;
MICROS_PER_DAY = MICROS_PER_DAY * 10;
MICROS_PER_DAY = MICROS_PER_DAY * 10;
System.out.println(MICROS_PER_DAY);
}

und da gings dann natürlich doch... was wohl zusätzlich zu meiner Verwirrung beigetragen hat.
Aber nun is klar.

Ich bezweifle dass das so kompiliert hat ;)
 

Neue Themen


Oben