Vor jeder Multiplikation den linken Multiplikator abrunden

Vampire

Mitglied
Hallo zusammen,

ich habe folgendes Problem: Die Formel (Methode berechneStat) dient dazu, Statuswerte wie Angriff oder Verteidigung zu berechnen. Aber im Spiel ist es so programmiert worden, dass vor jeder Multiplikation der linke Multiplikator auf eine ganze Zahl(Integer) abgerundet wird.

Beispiel: (2*basiswert+pDV+fp/4) -> (2*20.5+25+10/4)=68,5
Wichtig: Egal ob dort 68,9465 oder 68,0001 rauskommen würde es soll immer abgerundet werden(auf 68 bzw. wenn dort 59,87 rauskommt auf 59). Also sozusagen alles nach dem Komma weglassen.

Erst dann wird weiter gerechnet mit (68*level/100+5)*wesen. Hier wieder genau das gleiche, bevor mit wesen multipliziert wird, wird das Zwischenergebnis auf eine ganze Zahl abrunden.


Java:
    //Attribute
	private int level;
	private double basiswert;
	private double statuswert;
	private double wesen;
	private int fp;

    public double berechneStat(int pDV)
	{
		return ((2*basiswert+pDV+fp/4)*level/100+5)*wesen;
	}

Ich hoffe, dass meine Erklärung schlüssig ist.

Vielen Dank für Euere Hilfe

Lg Vampire
 
öm, was genau ist das problem, wenn du deine rechnung machst:
(2*basiswert+pDV+fp/4)
und diese dann in einen int cast, passiert genau dass, was du willst (wird einfach abgeschnitten:
(int)(2*basiswert+pDV+fp/4)
somit würde das bei dir so aussehen (notfalls musst du anpassen, wo genau du runden willst:
Java:
    public double berechneStat(int pDV)
    {
        return (double) ( ((int)((2*basiswert+pDV+fp/4)*level/100+5))*(int)wesen );
    }

sollte doch das tun, was du willst, ansonsten hab ich dein problem nicht ganz verstanden
 
Danke für den Tipp mit (int)(...)

Da ich mit den ganzen Klammern und so durcheinander gekommen bin hab ichs jetzt einfach so gemacht:

Java:
    public double berechneStatusAusLevel(int pLevel)
    {
    	int mZE1=(int)(2*basiswert+dvWert+fp/4);
    	int mZE2=(int)(mZE1*pLevel/100+5);
    	return mZE2*wesen;    	
    }
 
Zuletzt bearbeitet:
also:
du kannst in java erzwingen, das ein datentyp zu einem anderen datentyp wird, durch sogenanntes casten:
Java:
double i = 0.123;  //hier ist es ein double und wenn ich jetzt ne methode hab, die einen int zurückgibt, kann sie nicht i zurückgeben
                 //weil es der false datentyp ist.
int t = (int) i; //somit erzwinge ich, dass aus dem double ein int wird, da int aber keine komma hat und somit keinen wert von
               //0.123 haben kann wird einfach beim komma abgeschnitten, und der integer hat den wert 0

das funktioniert mit vielen datentypen, du kannst grundsätzlich aus jedem kleineren datentyp einen größeren machen:
Java:
short i = 1;
int t = i; //kein problem, da short nur 2 byte hat und diese problemlos in ein int passen
short f = t; // dies würde NICHT einfach so gehen, auch wenn der wert  von t garantiert in einen short passen würde
          //(war ja ursprünglich unser i)
//um das jetzt zu machen müssen wir casten:
short  f= (short) t; // das klappt jetzt problemlos

das sollte man nur dann machen, wenn man weiß, dass der wert da auch wirklich rein passt, oder es wie in deinem fall erwünscht ist, dass informationen verloren gehen.

Der genau aufbau ist folgender
datentyp2 varialbenName = (datentyp2) varialbe; // wobei varialbe vom varialbentyp1 ist
da bei dir mehrere werte verrechnet werden machst du eine klammer drum rum:
Java:
double i = 0.123;
double j = 2.345;
int r = (int) (i*j); //nun wird erst ausmultipliziert und dann erst gecastet (also die nachkommastellen abgeschnitten
                    //das ergebniss sieht hier nun so aus: 0, weil i*j = 0,288435 und die nachkommastellen werden beim
                    //casten einfach abgeschnitten.

hier hat es jetzt keine rolle gespielt, ob ich davor oder danach caste:
0.123*2.345 = 0.288 somit als int 0;
(int) i*(int) j => 0*0 = 0 somit schon wieder 0.
ganz anders sieht es aus, wenn man andere werte hat, z.b.:
i = 0.9;
j = 5;
i*j = 4.5 somit als int 4;
(int) i*(int) j= 0 * 5 = 0 somit völlig anderer wert, weil jede zahl einzelne gecastet wurde, und somit aus 0.9 bereits vor dem multiplizieren 0 wurde.

hoffe du hast es verstanden
 

Neue Themen


Zurück
Oben