Math.Round Bug!

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Math.Round Bug!

    Guten Abend,
    ich meine einen Math.Round Bug reproduziert zu haben:
    Unter .NET Framework 4.6,

    C#-Quellcode

    1. Console.WriteLine(Math.Round(6.5))

    Resultat: 6!

    C#-Quellcode

    1. Console.WriteLine(Math.Round(13.5))

    Resultat: 14!

    Woran mag das liegen?

    Update: Es sind (eventualiter) alle Zahlen die mit einer 6 enden (6.5, 16.5, 26.5!)

    Fix:

    C#-Quellcode

    1. public static float Round(float a, int n)
    2. {
    3. return (float)(((int)((((a + (((a * Math.Pow(10, n + 1)) % 10) / Math.Pow(10, n + 2))) * Math.Pow(10, n + 1)) % 10) / 5) / Math.Pow(10, n)) + ((a + (((a * Math.Pow(10, n + 1)) % 10) / Math.Pow(10, n + 2))) - (((a + (((a * Math.Pow(10, n + 1)) % 10) / Math.Pow(10, n + 2))) * Math.Pow(10, n + 1)) % 10) / Math.Pow(10, n + 1)));
    4. }


    Verschoben. ~Trade
    Und Gott alleine weiß alles am allerbesten und besser.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Wieso Bug?

    https://msdn.microsoft.com/en-us/library/wyk4d9cy(v=vs.110).aspx schrieb:

    The integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned.


    Edit:
    Ansonsten ist eine der entsprechende Überladung mit MidpointRounding.AwayFromZero ggf. hilfreich. Siehe auch msdn.microsoft.com/en-us/libra…ntrounding(v=vs.110).aspx

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „3daycliff“ ()

    Es könnte auch damit zusammenhängen, dass alle Floating Point Numbers gewisse Ungenauhigkeiten aufweisen, sodass viele Dezimalzahlen nicht exakt repräsentiert werden (können), wodurch speziell nach vielen Rechenschritten des öfteren Fehler auftreten können.

    φConst schrieb:

    Woran mag das liegen?
    Es gibt da eine Gerade-Zahl-Regel.

    Wiki schrieb:

    Mathematisches Runden
    ...
    Folgt auf die letzte beizubehaltende Ziffer lediglich eine 5 (oder eine 5, auf die nur Nullen folgen), so wird derart gerundet, dass die letzte beizubehaltende Ziffer gerade wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @nafets
    Integer sind Additionen aus 1, 2, 4, 8, ...
    Floats können halt auch in die andere Richtung gehen: 1/2, 1/4, 1/8, 1/16, ...
    6.5 ist einfach 4+2+1/2. Das geht sich also exakt aus. Genauso wie 4.5.
    Also daran liegt es nicht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Willkommen in Deutschland, in dem sogar der Mathe-Lehrplan von BWLern aufgestellt wurde.

    Ich Tippe einfach darauf, dass der Einfachheit halber nur das Kaufmännische Runden in Schulen dran genommen wird, wobei ich sagen muss, dass mir das mathematische Runden bis jetzt gerade auch "unbekannt" war. Ich könnte aber darauf Wetten, dass es ein Mathelehrer zumindest mal genannt hatte. :/