So runden Sie in C # auf die nächste ganze Zahl


Antworten:


200

Weitere Informationen finden Sie in der offiziellen Dokumentation . Beispielsweise:

Grundsätzlich geben Sie der Math.RoundMethode drei Parameter.

  1. Der Wert, den Sie runden möchten.
  2. Die Anzahl der Dezimalstellen, die nach dem Wert beibehalten werden sollen.
  3. Ein optionaler Parameter, den Sie aufrufen können, um die AwayFromZero-Rundung zu verwenden. (wird ignoriert, es sei denn, die Rundung ist nicht eindeutig, z. B. 1,5 )

Beispielcode:

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

Live-Demo

Sie benötigen, MidpointRounding.AwayFromZerowenn ein Wert von 0,5 aufgerundet werden soll. Leider ist dies nicht das Standardverhalten für Math.Round(). Bei Verwendung MidpointRounding.ToEven(Standardeinstellung) wird der Wert auf die nächste gerade Zahl 1.5gerundet ( wird gerundet 2, aber 2.5auch gerundet 2).


14
Auf der anderen Seite away from zerobedeutet Verwenden auch, dass -1.5sich auf runden wird -2.
Davogotland

2
Verwenden Sie Math.Ceiling, es ist keine gute Praxis, Math.Round für Reibungen zu verwenden, lesen Sie: stackoverflow.com/questions/9221205/… ,
Yakir Manor

3
Ich finde, dass Math.Round (1.5, 0) 2 zurückgibt
David Sykes

@davogotland ist ihr sowieso zu Runde 137,5 bis 140 nicht bis 138? Ich meine auf das nächste Zehntel runden?
Sam

1
@sam vielleicht durch 10 teilen, dann mit Math.Ceiling runden und schließlich durch 10 multiplizieren?
Davogotland

63
Math.Ceiling

immer aufgerundet (zur Decke hin)

Math.Floor

rundet immer ab (in Richtung Boden)

Was Sie suchen, ist einfach

Math.Round

welche Runden gemäß diesem Beitrag


ist ihr sowieso zu rund 137,5 bis 140 nicht bis 138? Ich meine auf das nächste Zehntel runden?
Sam

7

Du brauchst Math.Roundnicht Math.Ceiling. Ceiling"rundet" immer auf, während Roundje nach Wert nach dem Dezimalpunkt auf- oder abgerundet wird.


6

Es gibt dieses Handbuch und irgendwie auch eine nette Art:

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

Addiere einfach 0,5 zu einer beliebigen Zahl und wirf sie auf int (oder boden sie) und es wird mathematisch korrekt gerundet: D.


Es sieht immer noch verdächtig aus. Zunächst fragt die Frage nach Rundung nach oben und zweitens, wenn ich es habe gerade versucht nun, die Standardimplementierung von Math.Round (1.5) Runden 2. So dies nicht sein kann , was er wollte.
Ver

In Ihrem Beispiel wird außerdem Dezimalpunkt mit Dezimalkomma gemischt. Welches verwenden Sie normalerweise (in Schweden, denke ich)? :)
ver

oops ... oh yeah, sorry. Natürlich beim Programmieren des Dezimalpunkts, aber im formalen Text verwenden wir das Dezimalkomma. und ja, schweden ^^ über die frage und den "abrundungsteil": ich denke das ist nur ein sprachfehler. In den Beispielen von op runden einige Dezimalzahlen ab.
Davogotland

@ver ich runde nicht mit Math.Round ab, ich mache es mit einer Besetzung. Deshalb ist dieser Weg manuell und irgendwie süß;)
Davogotland

5

Sie können Math.Round verwenden, wie andere vorgeschlagen haben (empfohlen), oder Sie können 0,5 hinzufügen und in ein int umwandeln (wodurch der Dezimalteil gelöscht wird).

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2

5

Nur eine Erinnerung. Vorsicht vor Doppel.

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2

3

Sie haben die Math.Round-Funktion, die genau das tut, was Sie wollen.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
Was ist mit 1.5dem Wert? Sie benötigen mehr Parameter.
Nur Bolivianer hier

2

Dies wird auf die nächste 5 aufgerundet oder ändert sich nicht, wenn es bereits durch 5 teilbar ist

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}

2

Ich habe danach gesucht, aber mein Beispiel war, eine Zahl wie 4.2769 zu nehmen und sie in einer Zeitspanne von nur 4,3 fallen zu lassen. Nicht genau das gleiche, aber wenn das hilft:

Model.Statistics.AverageReview   <= it's just a double from the model

Dann:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

etc...


Ich verwende diese Methode, weil ich auch einen String benötige und .ToString ("n0") für mich die Rundung übernimmt: 1.5m.ToString ("n0") // gibt "2" zurück
Nathan Prather



0

Wenn Sie eher mit Ganzzahlen als mit Gleitkommazahlen arbeiten, ist dies der richtige Weg.

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

Hier sind sowohl "numr" als auch "denr" vorzeichenlose ganze Zahlen.


0

Verwenden Sie Math.Round(number)Runden auf die nächste ganze Zahl.


0

Schreiben Sie Ihre eigene runde Methode. Etwas wie,

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.