# Letze Steller einer integer Zahl



## Bluedaishi (3. Mrz 2016)

Hallo 
folgendes problem gibt es eine möglichkeit einen integer wert anletze stelle entweder auf 5 oder 0 zu runden.

vielen dank


----------



## JStein52 (3. Mrz 2016)

es gibt sicher mehrere Möglichkeiten. Eine wäre zahl%5 und je nach Rest diesen Rest von der Zahl subtrahieren oder 5-Rest addieren.


----------



## Bluedaishi (3. Mrz 2016)

hättest du da eine genauere lösung Bitttttteeee


----------



## kneitzel (3. Mrz 2016)

```
int modulo = zahl % 5;
switch (modulo) {
   case 0: ...
   case 1: ...
   case 2: ...
   case 3: ...
   case 4: ...
}
```
Die ... musst Du noch füllen. "break;" nicht vergessen wo notwendig. Die möglichen Aktionen sind:
- Zahl unverändert lassen (dann war es schon am Ende auf 0 oder 5)
- zahl = zahl - modulo;
- zahl = zahl - modulo + 5;

Das wirst Du doch jetzt hin bekommen. Ansonsten geh das doch einfach einmal mit verschiedenen Zahlen durch und schau, was zahl % 5 ist und was Du gerne als Ergebnis hättest....


----------



## kneitzel (3. Mrz 2016)

Statt der Berechnungen kannst Du natürlich auch für jedes case einfach eine fixe Berechnung machen wie zahl+=1; zahl -= 1; und so ...


----------



## Bluedaishi (3. Mrz 2016)

Na als ergebnis brauche ich die letzte stelle 5 oder 0 ich hab leider etwas druck ich muss das bis 21 uhr zu einer fertigen lösungen haben


----------



## Bluedaishi (3. Mrz 2016)

sorry


----------



## JStein52 (3. Mrz 2016)

so:


```
//        int zahl = 148;
      
        if ((zahl%5) < 3 )
            zahl -= zahl%5;
        else
            zahl += 5-zahl%5;
      
//        System.out.println("5: "+zahl);
```


----------



## Bluedaishi (3. Mrz 2016)

ich hoffe das funktioniert vielen vielen dank das ist wirklich super von dir


----------



## JStein52 (3. Mrz 2016)

Ja, ich habe es gerade getestet.


----------



## kneitzel (3. Mrz 2016)

Also da wird so oft %5 gerechnet ... das muss doch nur einmal sein. Und die folgende Version ist doch einfacher verständlich:

```
switch (zahl%5) {
   case 1: zahl -= 1; break;
   case 2: zahl -= 2; break;
   case 3: zahl += 2; break;
   case 4: zahl += 1; break;
}
```

Und auf so eine Lösung kommt man sofort, wenn man einfach die folgende Tabelle für die Zahlen von 1 - 10 füllt:

Zahl; zahl%5; gewünschtes Ergebnis; gewünschtes Ergebnis - zahl
1; 1; 0; -1
2; 2; 0; -2
3; 3; 5; 2
4; 4; 5; 1
5; 0; 5; 0
6; 1; 5; -1
7; 2; 5; -2
8; 3; 10; 2
9; 4; 10; 1
10; 0; 10; 0

Oder nicht?


----------



## JStein52 (3. Mrz 2016)

Ja, in deinen Cases machst du das gleiche wie ich und klar kann man sich das modulo-Ergebnis einmal ausrechnen und dann weiter verwenden.


----------



## JStein52 (3. Mrz 2016)

kneitzel hat gesagt.:


> da wird so oft %5


Ja, bei dir wird einmal % gerechnet, bei mir zweimal. Genau doppelt so oft


----------



## Bluedaishi (3. Mrz 2016)

JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    SUPER EIN DICKES DANKE SCHHÖNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN


----------



## Blender3D (3. Mrz 2016)

```
int roundToFive(  int zahl )
           int mod = zahl%5;
           if( mod == 0 ) return zahl;
           if( mod < 3  )  return zahl-mod;
           return zahl + 5- mod;
}
```
Oder so !


----------



## JStein52 (3. Mrz 2016)

Blender3D hat gesagt.:


> if( mod == 0 ) return zahl;


Gaaaanz schlecht, . Diese Abfrage kannst du dir sparen denn das passiert auch bei < 3


----------



## Bluedaishi (3. Mrz 2016)

ich hab einen wert gefunden da wurde die hinten die 4 stehen gelassen :-(


----------



## Bluedaishi (3. Mrz 2016)

//int zahl = 148;

        if ((zahl%5) < 3 ) <= müsste hier nicht 4 stehen ??????
            zahl -= zahl%5;
        else
            zahl += 5-zahl%5;

//        System.out.println("5: "+zahl);


----------



## Meniskusschaden (3. Mrz 2016)

Folgendes ist auch möglich:

```
public static int roundToFive(int zahl) {
    return (zahl+2)/5*5;
}
```
Ist zwar kurz, gefällt mir aber nicht, weil es falsch aussieht und deshalb nicht intuitiv lesbar ist.


----------



## Meniskusschaden (3. Mrz 2016)

Bluedaishi hat gesagt.:


> //int zahl = 148;
> 
> if ((zahl%5) < 3 ) <= müsste hier nicht 4 stehen ??????
> zahl -= zahl%5;
> ...


Meines Erachtens ist das richtig und bei 148 kommt 150 raus, oder habe ich das Problem falsch verstanden?


----------



## Bluedaishi (3. Mrz 2016)

das funktioniert auch alles bis auf einen wert setzt er mit hinten eine 4 statt 5 oder 0


----------



## Meniskusschaden (3. Mrz 2016)

Und bei welchem Wert passiert das? Ich dachte, es geht um die 148, weil die im Kommentar steht.


----------



## JStein52 (3. Mrz 2016)

Meniskusschaden hat gesagt.:


> oder habe ich das Problem falsch verstanden?


Genau. es wird hier auf die nächste 0 oder 5 gerundet !



Bluedaishi hat gesagt.:


> bis auf einen wert setzt er mit hinten eine 4 statt 5 oder 0


Nö, glaube ich nicht

Aber wo es nicht mehr funktioniert ist bei negativen Zahlen. Da wird in die falsche Richtung gerundet.


----------



## Bluedaishi (3. Mrz 2016)

bei dem wert 3574 lässt er ihn so eigentlich müsste das 0 sein


----------



## Meniskusschaden (3. Mrz 2016)

Kann ich nicht reproduzieren. Bei mir kommt 3575 raus.


----------



## JStein52 (3. Mrz 2016)

Meniskusschaden hat gesagt.:


> Bei mir kommt 3575 raus


Jaaaa


----------



## JStein52 (3. Mrz 2016)

Für negative Zahlen müsste man noch ein bisschen anpassen:


```
int zahl = -3578 ;
        int faktor = 1;
        if (zahl < 0) {
            faktor = -1;
            zahl   = Math.abs(zahl);
        }
       
        if ((zahl%5) < 3 )
            zahl -= zahl%5;
        else
            zahl += 5-zahl%5;
        zahl *= faktor;
        System.out.println("5: "+zahl);
```


----------



## Bluedaishi (3. Mrz 2016)

Sie ist aber nicht negative oder sehe ich das jetzt falsch


----------



## JStein52 (3. Mrz 2016)

3574 ist natürlich positiv und da hatte es ja auch vorher schon funktioniert  !!!  Mir war nur aufgefallen dass bei negativen Zahlen in die falsche Richtung gerundet wurde. Es war zwar auch immer 0 oder 5, manchmal aber falsch.


----------



## Bluedaishi (3. Mrz 2016)

ok verstanden ich habe nur positive werte

also ich habe eine summe 3600 rechne prozentual 2,5 prozent runter (ist nur als beispiel) draus werden dann diese 3574 das sind bisdahin noch double werte dann wandle ich sie mit df.format ins einen String
von da aus wieder in einen int wert dann durch deine schleife und dan wieder df.format vielleicht liegt das daran ????


----------



## Bluedaishi (3. Mrz 2016)

239 vor deiner if abfrage
18 240 240 danach 
aber in meiner txt danach steht 239 statt 240 bei anderen werten stimmt alles


----------



## JStein52 (3. Mrz 2016)

Bluedaishi hat gesagt.:


> 239 vor deiner if abfrage
> 18 240 240 danach


Also aus 239 wird 240 !! Habe ich gerade ausprobiert. Der Fehler muss an einer anderen Stelle sein. Aber ohne Code schwer zu sagen.


----------



## Bluedaishi (3. Mrz 2016)

ja an der console habe ich das auch nur in der txt steht der wert 239


----------



## JStein52 (3. Mrz 2016)

Schreibst du die falsche, nicht gerundete Zahl in deine txt-Datei ?


----------



## Bluedaishi (3. Mrz 2016)

nein es ist die richtige


----------



## JStein52 (3. Mrz 2016)

dann brauchen wir den Code sonst ist es Raterei


----------



## Bluedaishi (3. Mrz 2016)

```
String Ein_My = df.format(doub_minus_My);

int pla_int = Integer.parseInt(Ein_My);
               
     
                    if ((pla_int%5) < 3 ){
                        pla_int -= pla_int%5;
                    }else{
                        pla_int += 5-pla_int%5;
                    }

                Ein_My = df.format(pla_int);

raf.writeBytes(Ein_My);
```


----------



## Meniskusschaden (3. Mrz 2016)

Was ist denn df?


----------



## Bluedaishi (3. Mrz 2016)

```
DecimalFormat df = new DecimalFormat("#0");
```


----------



## InfectedBytes (3. Mrz 2016)

deinen double in einen string umwandeln um diesen dann in einen int umzuwandeln ist keine besonders gute idee. Du kannst direkt den double zu einem int casten:

```
int pla_int = (int)doub_minus_My;
```


----------



## Bluedaishi (3. Mrz 2016)

ja verstehe aber warum haut das beiu allen anderen zahlen hin ???


----------



## Bluedaishi (3. Mrz 2016)

hab es um gebaut haut auch nicht hin


----------



## Bluedaishi (3. Mrz 2016)

Wäre es nicht einfacher den String um zubauen wenn er auf 1,2,3,4 6,7,8,9 endet ????
geht das nicht einfacher ????


----------



## JStein52 (3. Mrz 2016)

Mach mal:


```
Ein_My = df.format(pla_int);
                System.out.println("String: "+Ein_My+" Zahl: "+pla_int);
```


----------



## JStein52 (3. Mrz 2016)

Bluedaishi hat gesagt.:


> warum haut das beiu allen anderen zahlen hin ???


Bei welcher Zahl haut es denn nun nicht hin ? 3574  ???


----------



## Meniskusschaden (3. Mrz 2016)

InfectedBytes hat gesagt.:


> deinen double in einen string umwandeln um diesen dann in einen int umzuwandeln ist keine besonders gute idee


Das sehe ich auch so. Trotzdem funktioniert der Code von Bluedaishi bei mir. Auch in der Ausgabedatei erscheint für 3574 das Ergebnis 3575.


----------



## JStein52 (3. Mrz 2016)

Ja, bei mir auch. Wollte mal sehen was bei ihm da ausgegeben wird.


----------



## Thallius (4. Mrz 2016)

Meniskusschaden hat gesagt.:


> Folgendes ist auch möglich:
> 
> ```
> public static int roundToFive(int zahl) {
> ...



Hatte schon fast aufgegeben dass jemand noch die einfache MAthematische Lösung postet


----------



## JStein52 (4. Mrz 2016)

Hast du mal getestet ob das auch mit 3574 funktioniert ??


----------

