Aufrunden ab .02

Volnick

Mitglied
Ich will eine Fläche durch die Breite teilen. Falls das Ergebniss also zum Beispiel 7.02 beträgt, soll es aufgerundet werden. Bei 7.01 soll es abgerundet werden.

Code:
double r = (fläche/breite);
if(r >= .02){
r++;
}
return (int) r;
 
K

kneitzel

Gast
Code:
public void analyseCode(String code){
    if (code.contains("0.98")){
        this.wtfPerMinute++;
    }
}

nach drei Monaten schaust du dir den Quellcode an und fragst dich, was du da gemacht hast und woher die 0.98 kommt
Nunja, dafür kann man das ja entsprechend schreiben, so dass es insgesamt lesbar ist und bleibt.
a) Konstanten sollten generell nicht mitten im Code als Literale stehen sondern als Konstanten entsprechend definiert werden.
b) Sowas zieht man ja in eine Methode, ggf in ein andere Klasse, so dass man da einen vernünftigen Namen vergeben kann. Und dann hat man schon einen recht gut lesbaren Code.
 
X

Xyz1

Gast
Java:
	static double runde(double d) {
		if (d - Math.floor(d) >= 0.02) {
			return Math.ceil(d);
		} else {
			return Math.round(d);
		}
	}

Java:
		for (int i = 0; i < 50; i++) {
			double d = i / 1000.0;
			System.out.println(d + " " + runde(d));
			//d = -d;
			//System.out.println(d + " " + runde(d));
		}


Was soll mit negativen Zahlen geschehen?
Logisch wäre, -0.98 => -0.0 und -0.981 => -1.0 (=> = wird zu...).
 

Volnick

Mitglied
Java:
    static double runde(double d) {
        if (d - Math.floor(d) >= 0.02) {
            return Math.ceil(d);
        } else {
            return Math.round(d);
        }
    }

Java:
        for (int i = 0; i < 50; i++) {
            double d = i / 1000.0;
            System.out.println(d + " " + runde(d));
            //d = -d;
            //System.out.println(d + " " + runde(d));
        }


Was soll mit negativen Zahlen geschehen?
Logisch wäre, -0.98 => -0.0 und -0.981 => -1.0 (=> = wird zu...).
Vielen Dank!
 

Thallius

Top Contributor
Sorry aber das ist wieder was das mir die Zehennägel aufrollt. Wenn ein Programmierer folgende Zeilen sieht:

int specialRound(float f)
{
return (int)(f+0.98);
}

und nicht sofort weiß was da passiert, dann sollte er vielleicht besser Bäcker oder Konditor werden....

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Sorry aber das ist wieder was das mir die Zehennägel aufrollt. Wenn ein Programmierer folgende Zeilen sieht:

int specialRound(float f)
{
return (int)(f+0.98);
}

und nicht sofort weiß was da passiert, dann sollte er vielleicht besser Bäcker oder Konditor werden....

Claus
Falls du dich auf @L0oNY und @kneitzel beziehst: das Problem ist nicht das was, sondern das warum.

Den Tipp von @kneitzel hast du in deinem Beispiel ja sogar selbst verwendet...

Edit: bzw schon ein was, aber kein „was passiert da, ich versteh das nicht“, sondern ein „was zur Hölle soll das“.
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Falls du dich auf @L0oNY und @kneitzel beziehst: das Problem ist nicht das was, sondern das warum.

Den Tipp von @kneitzel hast du in deinem Beispiel ja sogar selbst verwendet...

Edit: bzw schon ein was, aber kein „was passiert da, ich versteh das nicht“, sondern ein „was zur Hölle soll das“.

Warum? Weil es ein ganz einfacher Code ist den jeder mit einem Blick versteht, der für den Compiler super zu optimieren und damit sau schnell ist und kein 5 Zeilen Monstrum wie der Vorschlag von Tobias wo ich viel länger hinsehen muss um zu verstehen was das soll...
 

mrBrown

Super-Moderator
Mitarbeiter
Warum? Weil es ein ganz einfacher Code ist den jeder mit einem Blick versteht, der für den Compiler super zu optimieren und damit sau schnell ist und kein 5 Zeilen Monstrum wie der Vorschlag von Tobias wo ich viel länger hinsehen muss um zu verstehen was das soll...
Das „warum“ bezog sich nicht darauf, warum man den Code so schreiben würde...

Es geht darum, dass sich jeder „warum“ (... ist das nötig/steht das da/sind die 0,98 wichtig) fragt, wenn irgendwo in deiner 200-Zeilenmethode plötzlich ein (int)(f+0.98) auftaucht.
Die Variante von @Tobias-nrw finde ich auch nicht schön und hat genau die gleichen Nachteile. Warum du jetzt der Meinung bist, dass das zB @kneitzel als bessere Variante ansehen könnte, musst du mal erklären...


Viel wichtiger, als schnell zu verstehen, was genau der Code tut, ist übrigens, schnell zu verstehen, warum das gemacht ist, was die Intention dahinter ist usw.
i%4 == 0 ist super einfacher Code, trotzdem können das die wenigsten aus dem Stand erklären...
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Die wenigsten bezogen auf welche Gruppe? Ich hoffe mal, dass Du außerhalb der Gruppe der (Java-)Entwickler meinst...
Meine mit erklären mehr als nur zu sagen „prüft ob durch vier teilbar“ ;) aber durchaus bezogen auf Entwickler :p

Eben als Beispiel, dass das „warum, wieso, weshalb“ nicht mal aus solch einfachem Code hervorgeht.
 

mihe7

Top Contributor
Meine mit erklären mehr als nur zu sagen „prüft ob durch vier teilbar“ ;) aber durchaus bezogen auf Entwickler :p

Eben als Beispiel, dass das „warum, wieso, weshalb“ nicht mal aus solch einfachem Code hervorgeht.
Ach so, es geht noch um Kommentar 8, sprich den Hintergrund, weshalb er bei 0.2 aufrunden möchte. Das ist natürlich was anderes, denn ohne Kontext wird es immer schwierig.
 
X

Xyz1

Gast
Ich finde meinen Code lesbarer als das, was kneitzel und co. da zu veranstalten versuchen...

Und ja, ich würde meinen Code dann nicht lesbarer finden, wenn er "objektiv" gesehen nicht lesbarer wäre. Sprich, ich kann's einschätzen.

Wie sinnvoll was ist kümmert mich nicht so...
 
K

kneitzel

Gast
Ich finde meinen Code lesbarer als das, was kneitzel und co. da zu veranstalten versuchen...

Also das muss ich jetzt nicht verstehen, da Du unter dem Strich nichts anderes gemacht hast, als ich geschrieben habe (Mein Punkt b). Dass Du Punkt a) ablehnst, das kann ich jedoch nicht verstehen. Aber Du scheinst bisher halt nur kleine minimale Projekte zu kennen, was es evtl. etwas erklären würde ...

Und wenn Du Deinen komplexen Code mit dem von @Thallius vergleichst, dann findest Du Deinen komplexe Code wirklich besser? (Ist ok, ich will das nicht ausdiskutieren. Ich will nur mein Erstaunen ausdrücken.)

Ansonsten sollte man über die Namensgebung nachdenken. Eine Methode sollte so heißen, dass man das Verhalten erkennen kann und das Verhalten der Funktion ist kein einfaches Runden. Aber das ist auch nur eine kleine Anregung. Generell kann jeder das so handhaben, wie er möchte.
 

mihe7

Top Contributor
Und wenn Du Deinen komplexen Code mit dem von @Thallius vergleichst, dann findest Du Deinen komplexe Code wirklich besser?
Es ging ja um "lesbarer" und nicht um "besser". Und ich denke, das ist ein Problem "falsch" verstandener Lesbarkeit i. S. von "Clean Code".

Natürlich ist
Code:
falls nachkommaTeil(x) >= 0.2
    dann aufrunden(x)
    sonst abrunden(x)
(Pseudo-)Code, den eben auch der Bäcker von Nebenan sofort versteht.

Wenn es aber um die Lesbarkeit geht, dann darf ich davon ausgehen, dass den Code jemand liest, der ein gewisses Maß an Sachverstand mitbringt. Für so jemanden ist sofort klar, was mit (int)(x + 0.98) gemeint ist und der Code oben verlangt nur unnütze Lesezeit ab. Das ist nur meine Sicht der Dinge.
 

Ähnliche Java Themen

Neue Themen


Oben