# int Berechnungen



## NotAvailable (29. Jun 2012)

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


```
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.


```
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? 
Danke schonmal.


----------



## tfa (29. Jun 2012)

> Gibt 17777 zurück und nicht wie erwartet 66666.


Zeig mal ein vollständiges Programm, wo das demonstriert wird.


----------



## HoaX (29. Jun 2012)

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.


----------



## SlaterB (29. Jun 2012)

der zweite Fehler ist ein int-Überlauf,
bei

```
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 (29. Jun 2012)

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 (29. Jun 2012)

NotAvailable hat gesagt.:


> Ich hatte es so gemacht:
> 
> public static void main(String[] args)
> {
> ...



Ich bezweifle dass das so kompiliert hat


----------

