tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
5573
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    dila71 dila71 ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    76
    Hallo,

    gibt es in C# Onboardmittel für kaufmännisches Runden?
    Ich gehe mal davon aus (zumindest habe ich nix gegenteiliges gefunden), dass die Math.Round(...) - Methode mathematisch rundet.

    x,44499 ist rund x,044 nach kaufmännischer Rundung
    x,44499 ist rund x,045 nach mathematischer Rundung auf 2 Stellen

    Danke
    DiLa
     

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Diese Frage hättest aber vorher auch austesten können ....
    Code :
    1
    
    double test = Math.Round(0.444999, 2);
    Obiger Code ergibt 0.44
     

  3. #3
    dila71 dila71 ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    76
    1. Du hast Recht.
    2. Das Beispiel war schlecht gewählt und machte mein Problem nicht deutlich. (Darum 1.) Hätte ich das Problem nicht falsch beschrieben, wäre die Lösung nicht so einfach.

    3. Meine Infos zum kaufmännischen Runden waren falsch, warum sich auch eine nachgereichte richtige Beschreibung des falschen Problems erübrigt.
    4. Die Lösung (laut meinem jetzigen Kenntnisstand) heist:
    Math.Round( 0.4445, 3, MidpointRounding.AwayFromZero)
    Da eine 5 immer aufgerundet und nicht abgerundet wird.

    Trotzdem Danke

    DiLa
    Geändert von dila71 (31.08.06 um 13:26 Uhr)
     

  4. #4
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    In Zukunft bitte immer anführen für welches Framework die Lösung sein soll. Das ist Punkt 1.

    Du willst eine kaufmännische Rundung, korrekt? Wenn ja, dann reicht meine Lösung vollkommen aus und du brauchst die Midpoint Enum überhaupt nicht mehr.

    Aus 0.44499 wird 0.44
    Aus 0.44501 wird 0.45

    Das ist kaufmännische Rundung. Vermutlich brauchst du es auch nur für 2 Stellen, dann brauchst du auch nur 2 Stellen angeben.
     

  5. #5
    dila71 dila71 ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    76
    Nochmal, muss ich mich geschlagen geben, was die Angebe des Framworks anbetrifft.

    Aber:
    Die Midpoint Enum muss ich angeben, denn diesmal hattest Du schlechte Beispiele.
    0,445001 wird zu 0,45 auch ohne die Angabe MidpointRounding.AwayFromZero
    ohne die 001 aber wird 0,445 zu 0,44 und das ist nicht kaufmännisch, da die 5 immer aufgerundet wird.
    (Wie gesagt meine Angaben zum Kaufmännischen Runden haben sich aus verschiedenen Quellen auch öfter geändert, und ich kann nur von meinem jetzigen Kenntnisstand ausgehen.)

    Da MidpointRounding.AwayFromZero das tut was der jetzigen Aufgabenstellung entspricht setze ich das Thema auf erledigt. Nochmal Danke.
     

  6. #6
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Stimmt, bei 0.4450 rundet Math.Round ab. Unabhängig dessen, rundest du hoffentlich nicht bevor du weiterrechnest
     

  7. #7
    dila71 dila71 ist offline Mitglied Silber
    Registriert seit
    Jul 2005
    Beiträge
    76
    Jein,
    Am Ende einer Teilrechnung, aber an einigen Stellen wird bei den Vorschriften zu diesem Thema auch ein Runden "mittendrin" verlangt. Da muss ich dann eben vor dem Ende.

    So bevor es zum Spam ausartet, letztmalig Danke und geschlossen

    DiLa
     

  8. #8
    bierspritzn bierspritzn ist offline Rookie
    Registriert seit
    May 2007
    Beiträge
    7
    Hallo,

    habe bei mir ein seltsames Phänomen entdeckt mit der Funktion System.Math.Round:
    Mach ich was falsch oder versteh ich was nicht richtig.

    ich möchte die Zahl 294,405 auf zwei Nachkommastellen runden. Mit unten aufgeführten Code erhalte ich jedoch 294,4. Ich würde allerdings 294,41 erwarten.
    Gebe ich 249,405 ein erhalte ich 249,41.
    Ich kann die Funktionsweise von System.Math.Round nicht ganz nachvollziehen. Kann mir jemand weiterhelfen?

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    Public Class Form1
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim t1 As Double = CType(TextBox1.Text, Double)
            Dim ergebnis As Double
     
            ergebnis = System.Math.Round((t1), 2, MidpointRounding.AwayFromZero)
     
            TextBox2.Text = ergebnis
        End Sub
     
        End Class
     

  9. #9
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    Du machst nichts falsch.
    Die Zahlen werden für die Berechnung in ihren Binärwert umgewandelt.
    Nun können Dezimalzahlen aber leider nicht 100% Binär dargestellt werden was zu leichten Abweichungen führt.
    Das wiederrum führt dann natürlich zu einem Fehler beim Runden. Wobei es eigentlich garkein Fehler ist.

    Mal ein Beispiel:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    double x, y;
     
                x = 0.405;
                y = Math.Round(x, 2, MidpointRounding.AwayFromZero);
                Console.WriteLine(x + " => " + y);
    .
    .
    .
                x = 9.405;
                y = Math.Round(x, 2, MidpointRounding.AwayFromZero);
                Console.WriteLine(x + " => " + y);

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    0,405 => 0,41
    1,405 => 1,41
    2,405 => 2,4
    3,405 => 3,41
    4,405 => 4,41
    5,405 => 5,41
    6,405 => 6,41
    7,405 => 7,41
    8,405 => 8,4
    9,405 => 9,4
     
    In order to understand recursion, one must first understand recursion.

  10. #10
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Um die Antwort von rd4eva zu illustrieren:
    du rundest in Wirklichkeit gar nicht die Zahl 8,405, sondern 8,40499973297111914
    Probier einfach mal folgenden Beispielcode aus:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    static void Test()
    {
        Double temp = 7.405f;            
        print (temp);
        temp= Math.Round(temp, 3, MidpointRounding.AwayFromZero);
        print(temp);            
        temp = 8.405f;
        print(temp);
        temp= Math.Round(temp,3, MidpointRounding.AwayFromZero);
        print(temp);
        Console.ReadKey();
    }
     
    private static void print(Double value)
    {
        Console.WriteLine(value.ToString("R"));
    }
    Die Formatangabe "R" steht für "round trip" und garantiert, dass die Konversation zwischen String und Double eindeutig ist (siehe MSDN). Wie du sehen wirst, wird deine Eingabe nicht so interpertiert, wie du es erwartest. Das hat den Grund, den rd4eva schon genannt hat: ein Double kann diese Zahl schlichtweg überhaupt nicht darstellen.
    Geändert von Shakie (13.07.11 um 22:52 Uhr)
     
    hihi = -h²

  11. #11
    bierspritzn bierspritzn ist offline Rookie
    Registriert seit
    May 2007
    Beiträge
    7
    Hallo,

    danke für die ausführlichen Erläuterungen. ich verstehe jetzt die Problematik.
    Wie kann ich nun sicherstellen, dass x.405 auf x.41 aufgerundet wird und nicht ab?

    gruß
     

  12. #12
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Du musst einen anderen Datentyp verwenden, zum Beispiel Decimal statt Double.
     
    hihi = -h²

Ähnliche Themen

  1. Bewertungen Runden
    Von emptynick im Forum PHP
    Antworten: 6
    Letzter Beitrag: 07.10.07, 20:30
  2. Kaufmännisches Und bei JS
    Von Divi im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 01.03.07, 13:21
  3. C# - Runden
    Von Alexander12 im Forum .NET Datenverwaltung
    Antworten: 1
    Letzter Beitrag: 25.10.05, 17:43
  4. Runden
    Von Nanaki im Forum Visual Basic 6.0
    Antworten: 6
    Letzter Beitrag: 03.02.03, 16:33
  5. Das Runden von Zahlenwerten
    Von AleX im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 31.05.01, 19:28