Announcement

Collapse
No announcement yet.

Math.Round rundet nicht ganz richtig

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Math.Round rundet nicht ganz richtig

    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

  • #2
    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.

    Comment


    • #3
      gibt es eine Möglichkeit dass das Programm auf 1 statt auf 2 rundet?

      MFG

      Comment


      • #4
        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:
        Code:
        if ((d - f) > 0.5)
        kann dieses verhalten auch geändert werden bei bedarf.



        Code:
                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
        Zuletzt editiert von Nooa; 27.06.2011, 14:47.

        Comment


        • #5
          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;
          }

          };
          Christian

          Comment


          • #6
            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

            Comment


            • #7
              tut er doch

              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
              Zuletzt editiert von Nooa; 27.06.2011, 16:26.

              Comment


              • #8
                Noch 'ne Version

                [Highlight=C#]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;
                }[/Highlight]

                Comment


                • #9
                  uhhhh jaaa, diese version ist viel besser, weil die auch negative zahlen mit abdeckt... (macht meine nicht)

                  Originally posted by Ralf Jansen View Post
                  Noch 'ne Version

                  [Highlight=C#]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;
                  }[/Highlight]

                  Comment

                  Working...
                  X