individuelles Runden

tiek

Mitglied
Hallo!
Ich suche eine Möglichkeit Zahlen so zu runden:
0.13 -> 0.2
0.16 -> 0.2
0.91 -> 1
1.3 -> 2
1.31 -> 2

11 -> 20
19 -> 20
111 -> 200
191 ->200
Ist irgendwie logarithmisch.
Irgendwelche Vorschläge?
 

Landei

Top Contributor
Java:
public class Round {
    public static double round(double d) {
        int k = 0;
        while(d < 0.2) {
            d *= 10;
            k--;
        }
        while(d > 2) {
            d /= 10;
            k++;
        }
        return (d <= 1 ? 1 : 2) * Math.pow(10,k);
    }

    public static void main(String... args) {
        for(double d : new double[]{0.13, 0.16, 0.91, 1.3, 1.31, 11, 19, 111, 191} ) {
           System.out.println("" + d + " -> " + round(d));
        }
    }
}
 

Landei

Top Contributor
Abrunden wäre
Java:
...
return (d < 1 ? 0.2 : 1) * Math.pow(10,k);
...


Der Code ist absolut simpel: Die beiden Schleifen sorgen durch Multiplikation oder Division durch 10 dafür, dass d in das "Fenster" von 0.2 bis 2 passt. Ist dann d kleiner als 1, wird es auf 1, ansonsten auf 2 aufgerundet. Nun muss man natürlich d wieder auf die ursprüngliche "Größenordnung" bringen. Deshalb merken sich die Schleifen die Anzahl der Multiplikationen/Divisionen in der Variable k, so dass man diese Aktionen am Ende durch Multiplikation mit 10^k sozusagen wieder rückgangig macht.
 

tiek

Mitglied
Ich war scheinbar etwas zu früh mit meiner Freude.
Ich gebe noch mal ein paar Beispiele damit etwas klarer wird, was ich mir wünsche:
-0.13 -> -0.2
-0.16 -> -0.2
-0.34 -> -0.4
-0.61 -> -0.7
-0.91 -> -1.0
-1.3 -> -2.0
-1.31 -> -2.0
-6.1 -> -7.0
-11.0 -> -20.0
-19.0 -> -20.0
-83.3 -> -90.0
-111.0 -> -200.0
-191.0 -> -200.0

0.13 -> 0.2
0.16 -> 0.2
0.34 -> 0.4
0.61 -> 0.7
0.91 -> 1.0
1.3 -> 2.0
1.31 -> 2.0
6.1 -> 7.0
11.0 -> 20.0
19.0 -> 20.0
83.3 -> 90.0
111.0 -> 200.0
191.0 -> 200.0
 
S

SlaterB

Gast
und was funktioniert davon noch nicht? wäre ja bisschen mühsam selber zu testen,
wenn es nur um die negativen geht: feststellen ob negativ, merken, evtl. positiv machen, runden, am Ende wenn nötig wieder negativ machen
 
S

SlaterB

Gast
hier mal ein Code von mir, nur für positive Zahlen,
findet mehrere Abstufungen, kann bisher auch verkleinern (11 -> 10),

auch für Zahlen zwischen 0 und 1 geeignet

Java:
    public static final int[] FACTOR =
        {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};

   /**
     * Findet einen Faktor, eine Potenz von 10, mit dem eine Zahl multipliziert v werden
     * muss, damit sie größergleich 1 und kleiner 10 ist. Bisher nur im begrenzten
     * int-Bereich.
     * 
     * @param value
     * @return int
     */
    public static double findFactor(double value)
    {
        if (value <= 0) throw new RuntimException();
        double k = Math.log10(_alue);
        if (k > 1)
        {
            int x = (int)Math.ceil(k - 1);
            return FACTOR[x];
        }
        if (k < 0)
        {
            int x = (int)Math.ceil(-k);
            return 1.0 / FACTOR[x];
        }
        return 1;
    }

    /**
     * Normiert eine Zahl, liefert einfachere Werte in der Nähe, z.B. 20.000 für 19.000,
     * 10 für 11 usw.
     * 
     * @param value
     * @return int
     */
    public static double normalize(double value)
    {
        double fac = findFactor(value);
        // value nun zwischen 1 und 10
        value /= fac;
        if (value < 1.25)
            value = 1;
        else if (value < 1.75)
            value = 1.5;
        else if (value < 2.25)
            value = 2;
        else if (value < 2.75)
            value = 2.5;
        else if (value < 3.5)
            value = 3;
        else if (value < 4.5)
            value = 4;
        else if (value < 6.25)
            value = 5;
        else if (value < 8.75)
            value = 7.5;
        else
            value = 10;
        value *= fac;
        return value;
    }
 

Ariol

Top Contributor
@SlaterB: Ich hab mir mal grad deinen Code geklaut :wink:

@tiek:
Java:
public class Round {
    public static double round(double d) {

        if(d==0) {
        	return 0;
        }

        int k = 0;
        
        double abs = Math.abs(d);
        double prefix=d/abs;
        
        //Nur eine Stelle vor dem Komma
        while(abs < 1) {
        	abs *= 10;
            k--;
        }
        while(abs >= 10) {
        	abs /= 10;
            k++;
        }
        
        return prefix * Math.ceil(abs) * Math.pow(10,k);
    }
 
    public static void main(String... args) {
        for(double d : new double[]{-0.13, 0.16, 0.34, 0.91, 1.3, -1.31, 11, 19, 111, 191} ) {
           System.out.println("" + d + " -> " + round(d));
        }
    }
}

EDIT: Division durch 0 verhindert.
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben