Ich habe da einen Denkfehler... Ich habe eine sbyte Variable welche Werte im Bereicht von -120 bis 120 enthält. Ich würde gerne diesen Wert in Prozent umrechnen, mit einem einfachen Dreisatz komm ich da nun leider nicht ran. Umwandeln in ein byte geht ja auch nicht, da ich dann über den Overflow komme. Stehe da gerade auf dem Schlauch.
Jim M. schrieb: > Gegenfrage: Was ist 0%? -120 ist 0% Jim M. schrieb: > Ansonsten: (Wert + 120)/2,4 Doof... ja stimmt :-D
Draco schrieb: > Jim M. schrieb: >> Ansonsten: (Wert + 120)/2,4 > > Doof... ja stimmt :-D Geht auch nicht, da ich ja dann bei -50%... das ist ja das Problem wovor ich stehe, ich überlege mir gerade schon einfach eine temporäre byte Variable zu machen, den sbyte+120 dahinein schiebe und dann mit dem Bereich von 0-240 über die byte Variable rechne, wird wohl das einfachste sein.
Mit Wert/2.4+50 bleibt man im sbyte. Aber ob das mit decimal, float oder double im Nenner richtig gerechnet wird, weiss ich gerade nicht. Ausprobieren...
Ich hätte das einfach in ein unsignet byte umgewandelt und dann gerechnet byte = sbyte + 120;
Zack schrieb: > Ausprobieren... Es geht. Beispiel:
1 | for (int i = -120; i <= 120; i += 10) |
2 | {
|
3 | sbyte wert = (sbyte)i; |
4 | sbyte prozent = (sbyte)(wert / 2.4 + 50); |
5 | |
6 | Console.WriteLine(string.Format("{0} -> {1}%", wert, prozent)); |
7 | }
|
Ausgabe:
1 | -120 -> 0% |
2 | -110 -> 4% |
3 | -100 -> 8% |
4 | -90 -> 12% |
5 | -80 -> 16% |
6 | -70 -> 20% |
7 | -60 -> 25% |
8 | -50 -> 29% |
9 | -40 -> 33% |
10 | -30 -> 37% |
11 | -20 -> 41% |
12 | -10 -> 45% |
13 | 0 -> 50% |
14 | 10 -> 54% |
15 | 20 -> 58% |
16 | 30 -> 62% |
17 | 40 -> 66% |
18 | 50 -> 70% |
19 | 60 -> 75% |
20 | 70 -> 79% |
21 | 80 -> 83% |
22 | 90 -> 87% |
23 | 100 -> 91% |
24 | 110 -> 95% |
25 | 120 -> 100% |
Der Typ der Division ist ein double. Daher noch der Cast zum sbyte, der die Nachkommastellen abschneidet. Eventuell möchte man lieber runden...
Ben S. schrieb: > Ich hätte das einfach in ein unsignet byte umgewandelt und dann > gerechnet > byte = sbyte + 120; Ja mach ich auch nun so: Draco schrieb: > ...ich überlege mir gerade schon einfach eine temporäre byte > Variable zu machen, den sbyte+120 dahinein schiebe und dann mit dem > Bereich von 0-240 über die byte Variable rechne, wird wohl das > einfachste sein...
Es geht auch ohne floating point:
1 | for (sbyte value = -120; value <= 120; value += 10) |
2 | {
|
3 | int i = ((int) value + 120) * 100; |
4 | sbyte percent = (sbyte) (i / 240); |
5 | |
6 | Console.WriteLine(string.Format("{0} -> {1}%", value , percent)); |
7 | }
|
Egal, da es durch die Division ein double wird. Davon ab funktioniert die Schleife mit dem sbyte nicht wie gewünscht. Der Nach dem 120er Durchlauf wird value um 10 erhöht und es findet ein Überlauf statt. Der Wert ist nun negativ und die Schleife macht weiter.
Zack schrieb: > Egal, da es durch die Division ein double wird. Quatsch. Wenn zwei integers dividiert werden findet eine Integer-dividierung statt, nix float oder double. > Davon ab funktioniert > die Schleife mit dem sbyte nicht wie gewünscht. Der Nach dem 120er > Durchlauf wird value um 10 erhöht und es findet ein Überlauf statt. Der > Wert ist nun negativ und die Schleife macht weiter. Getroffen, Sherlock. Aber das lässt sich mit einem "<" statt "<=" lösen.
Eric B. schrieb: > Wenn zwei integers dividiert werden findet eine > Integer-dividierung statt, nix float oder double. Klar, aber da die Teilung durch einen double einen double ergibt (mein Beispiel), ist es egal. Der Cast zum sbyte bleibt - ob vom int oder vom double. > Aber das lässt sich mit einem "<" statt "<=" lösen. Watson, wie erreichen Sie dann value==120? Nur Spass - ist auch egal, da es doch nur ein Beispiel ist. Also mal locker durch die Hose atmen...
Zack schrieb: > Klar, aber da die Teilung durch einen double einen double ergibt (mein > Beispiel), ist es egal. Ich dachte dein Kommentar galt mein Beispielcode. > Watson, wie erreichen Sie dann value==120? Nicht :-P Oder so
1 | for(value = -120; value != -126; value +=10) |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.