Forum: PC-Programmierung C# Prozente aus negativen sbyte berechnen


von Draco (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

Gegenfrage: Was ist 0%?

Ansonsten: (Wert + 120)/2,4

von Draco (Gast)


Lesenswert?

Jim M. schrieb:
> Gegenfrage: Was ist 0%?

-120 ist 0%

Jim M. schrieb:
> Ansonsten: (Wert + 120)/2,4

Doof... ja stimmt :-D

von Draco (Gast)


Lesenswert?

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.

von Zack (Gast)


Lesenswert?

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...

von Ben S. (theben)


Lesenswert?

Ich hätte das einfach in ein unsignet byte umgewandelt und dann 
gerechnet
byte = sbyte + 120;

von Zack (Gast)


Lesenswert?

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...

von Draco (Gast)


Lesenswert?

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...

von Eric B. (beric)


Lesenswert?

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
}

von Zack (Gast)


Lesenswert?

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.

von Eric B. (beric)


Lesenswert?

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.

von Zack (Gast)


Lesenswert?

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...

von Eric B. (beric)


Lesenswert?

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
Noch kein Account? Hier anmelden.