PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Math.Round rundet nicht ganz richtig



BigB1991
27.06.2011, 13:17
Hallo Community,

ich arbeite gerade an einem kleiem Programm und benutze für eine meiner Methoden die Methode Round der Klasse Math.

Nun is es doch so dass ich mit MidpointRounding.ToEven eine Zahl die genau zwischen zwei Zahlen liegt auf oder abrunde in diesem Fall abrunde. Aber egal wie ich es mache für nNumberOfLines kommt immer 2 raus und nicht die gewünschte 1.

int nNumberOfLines = Convert.ToInt32(Math.Round(Convert.ToDecimal(Conve rt.ToDecimal((2 + 1)) / Convert.ToDecimal(2)), MidpointRounding.ToEven));

Hoffe mir kann jemand helfen.

MFG

Ralf Jansen
27.06.2011, 14:02
MidpointRounding.ToEven

Du möchtest laut Code zur nächsten geraden (even) Zahl runden. Welche gerade Zahl ist wohl der 1.5 am nächsten ;)

Falls du die Erklärung von ToEven aus der Msdn hast kann ich dir nur raten der deutschen Übersetzung zu misstrauen. Wenn du auch nur halbwegs Englisch kannst nimm das Original.

BigB1991
27.06.2011, 15:25
gibt es eine Möglichkeit dass das Programm auf 1 statt auf 2 rundet?

MFG

Nooa
27.06.2011, 15:41
der folgende Code macht genau das was du willst. (vorrausgesetzt ich habe dich richtig verstanden)
er ist nicht sauber geschrieben, benötigt also ein wenig säuberung :-)

aber so wie er da steht, rundet er bei 0.5 ab und bei 0.51 auf.
solange ich das richtig verstanden habe.


in der Zeile:

if ((d - f) > 0.5)
kann dieses verhalten auch geändert werden bei bedarf.




private void button1_Click(object sender, EventArgs e)
{
decimal x = Convert.ToDecimal(textBox1.Text); // hole divident
decimal y = Convert.ToDecimal(textBox2.Text); // hole divisor
decimal z = (x / y); // ergebnis

float d = (float)z; // convert to float
float f = (float)Math.Floor(d); // hole ganze zahl

if ((d - f) > 0.5) // unterschied größer 0.5?
{
d = (float)Math.Floor(d) + 1; // fake: runde auf
} else {
d = (float)Math.Floor(d); // fake: runde ab
}

label1.Text = d.ToString(); // ausgabe
}


mfg Nooa :cool:

Christian Marquardt
27.06.2011, 15:53
Vielleicht lässt sich dieser C/C++ Schnipsel umsetzen

double round(double zahl,int stellen)
{
double order=pow(10.0,stellen);
return (int)(zahl*order+(zahl>0?0.5:-0.5))/order;
}

};

BigB1991
27.06.2011, 16:04
also ganz richtig hast dus leider nicht verstanden ich möchte dass die zahl in diesem falle 1.5 nicht aufgerundet sondern abgerundet wird also statt 2 auf 1 abrunden, er soll grundsätzlich bei 1.5 abrunden und den rest aufrunden.

MFG

Nooa
27.06.2011, 17:05
tut er doch :eek:

1 / 2 = x

wenn x größer 0.5 (das heißt 0.50...01 wird aufgerundet) dann runde auf
wenn x gleiner oder gleich 0.5 ist runde ab

ergebnis: 0

macht also doch genau das was du willst ;)

zumindest habe ich das gerade eben so getestet und es funktioniert prima :rolleyes:

Ralf Jansen
27.06.2011, 20:42
Noch 'ne Version ;)

static decimal RoundHalfTowardsZero(decimal value, int digits)
{
decimal factor = (decimal)Math.Pow(10.0, digits);
if (value >= 0)
return Math.Ceiling((value * factor) - 0.5m) / factor;
else
return Math.Floor((value * factor) + 0.5m) / factor;
}

Nooa
27.06.2011, 23:07
uhhhh jaaa, diese version ist viel besser, weil die auch negative zahlen mit abdeckt... (macht meine nicht)


Noch 'ne Version ;)

static decimal RoundHalfTowardsZero(decimal value, int digits)
{
decimal factor = (decimal)Math.Pow(10.0, digits);
if (value >= 0)
return Math.Ceiling((value * factor) - 0.5m) / factor;
else
return Math.Floor((value * factor) + 0.5m) / factor;
}