2016-08-09 14 views
-1

Kann mir jemand erklären, warum der untere Code 1100 in beiden Fällen ausgibt?Warum ändert Math.Round() MidpointRounding nach Dezimal 1100

decimal toEven = 1100.5m; 
decimal awayFromZero = 1099.5m; 

Console.WriteLine(Math.Round(toEven)); // output 1100 
Console.WriteLine(Math.Round(awayFromZero)); // output 1100 

Es sieht aus wie die Math.Round() ändert MidpointRounding Strategie nach der Nummer 1100. Wenn Sie Math.Round() auf Dezimalstellen unter 1100 mit einer 0,5 dezimal Math.Round() verwendet die AwayFromZero MidpointRounding standardmäßig. Wenn Sie Dezimalzahlen über 1100 verwenden, verwendet Math.Round() standardmäßig ToEven MidpointRound. Warum?

Ich weiß, dass ich den MidpointRounding selbst einstellen kann, um das Problem zu beheben. Ich bin nur neugierig, warum Math.Round() so funktioniert.

+1

Wie haben Sie '1100' gefunden? Es wird standardmäßig immer auf die gerade Zahl gerundet. – Groo

Antwort

2

Ich bin nur neugierig, warum Math.Round() funktioniert so.

Denn das ist die Art, wie es and documented verhalten angefertigt:

Wenn die Bruchkomponente von d auf halbem Weg zwischen zwei ganzen Zahlen ist, von denen eine gerade und die andere ungerade ist, die gerade Zahl ist ist zurückgekommen.

Das Verhalten entweder ändern 1100 nicht um, Math.Round(1097.5m) und Math.Round(1098.5m) beide Rückkehr 1098 zum Beispiel.

+0

Ich kann sehen, dass ich das Verhalten des geraden Begriffes missverstanden habe. Danke fürs klarstellen. – Poku