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).

Nur Bolivianer hier
quelle
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

devrooms
quelle
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.

dasblinkenlight
quelle
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.

Davogotland
quelle
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
Marlon
quelle
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
Kosmas
quelle
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.
user496607
quelle
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);
}
Rick
quelle
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...

user2970629
quelle
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
1

Verwendung Math.Round:

double roundedValue = Math.Round(value, 0)
Thomas Levesque
quelle
1
var roundedVal = Math.Round(2.5, 0);

Es wird Ergebnis geben:

var roundedVal = 3
Ankita_systematix
quelle
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.

Sarath Kumar
quelle
0

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

Codejockie
quelle
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

Sandeep Anand
quelle
-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
Salma
quelle