Cómo redondear al número entero más cercano en C #

Respuestas:

200

Consulte la documentación oficial para obtener más información. Por ejemplo:

Básicamente le das al Math.Roundmétodo tres parámetros.

  1. El valor que desea redondear.
  2. El número de decimales que desea mantener después del valor.
  3. Un parámetro opcional que puede invocar para utilizar el redondeo AwayFromZero. ( ignorado a menos que el redondeo sea ambiguo, por ejemplo, 1,5 )

Código de muestra:

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

Demo en vivo

Necesita MidpointRounding.AwayFromZerosi desea redondear un valor de .5. Desafortunadamente, este no es el comportamiento predeterminado de Math.Round(). Si utiliza MidpointRounding.ToEven(el valor predeterminado), el valor se redondea al número par más cercano ( 1.5se redondea a 2, pero 2.5también se redondea a 2).

Solo bolivianos aquí
fuente
14
por otro lado, usar away from zerotambién significa que -1.5redondeará a -2.
Davogotland
2
use Math.Ceiling, no es una buena práctica usar Math.Round para las fricciones, lea: stackoverflow.com/questions/9221205/… ,
Yakir Manor
3
Encuentro que Math.Round (1.5, 0) devuelve 2
David Sykes
@davogotland es su de todos modos para redondear 137,5 a 140 no a 138? Me refiero a redondear a la décima más cercana.
sam
1
@sam tal vez dividir por 10, luego redondear con Math.Ceiling y finalmente multiplicar por 10?
Davogotland
63
Math.Ceiling

siempre redondea (hacia el techo)

Math.Floor

siempre redondea hacia abajo (hacia el suelo)

lo que buscas es simplemente

Math.Round

que rondas según esta publicación

devrooms
fuente
¿Es su de todos modos redondear 137,5 a 140 no a 138? Me refiero a redondear a la décima más cercana.
sam
7

Necesitas Math.Round, no Math.Ceiling. Ceilingsiempre "redondea" hacia arriba, mientras que Roundredondea hacia arriba o hacia abajo según el valor después del punto decimal.

dasblinkenlight
fuente
6

hay este manual, y también una forma un poco linda:

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

simplemente agregue 0.5 a cualquier número, y échelo a int (o al piso) y se redondeará matemáticamente correctamente: D

davogotland
fuente
Todavía parece sospechoso. En primer lugar, la pregunta se refiere a redondear hacia arriba y en segundo lugar, cuando lo probé hace un momento, la implementación predeterminada de Math.Round (1.5) rondas a 2. Así que esto puede no ser lo que quería.
ver
Además, su ejemplo mezcla el punto decimal con la coma decimal. ¿Cuál usas normalmente (en Suecia, supongo)? :)
ver
Ups ... oh sí, lo siento. en la programación del punto decimal, por supuesto, pero en el texto formal usamos la coma decimal. y sí, suecia ^^ sobre la pregunta y la parte de "redondeo": creo que es solo un error de lenguaje. en los ejemplos dados por op, algunos números decimales se redondean hacia abajo.
Davogotland
@Siempre que no redondeo con Math.Round, lo hago con un yeso. es por eso que esta manera es manual y un poco linda;)
davogotland
5

Puede usar Math.Round como otros han sugerido (recomendado), o puede agregar 0.5 y convertir a un int (que eliminará la parte decimal).

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
fuente
5

Simplemente un recordatorio. Cuidado con el doble.

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

Tienes la función Math.Round que hace exactamente lo que quieres.

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.
user496607
fuente
1
¿Qué pasa 1.5con el valor? Necesita más parámetros.
Solo bolivianos aquí
2

esto se redondeará al 5 más cercano o no cambiará si ya es divisible por 5

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

Estaba buscando esto, pero mi ejemplo fue tomar un número, como 4.2769 y colocarlo en un intervalo como solo 4.3. No es exactamente lo mismo, pero si esto ayuda:

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

Luego:

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

etc ...

usuario2970629
fuente
Estoy usando este método porque también necesito una cadena y .ToString ("n0") se encarga de redondear por mí: 1.5m.ToString ("n0") // devuelve "2"
Nathan Prather
1

Utilizar Math.Round:

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

Dará resultado:

var roundedVal = 3
Ankita_systematix
fuente
0

Si trabaja con números enteros en lugar de números de punto flotante, este es el camino.

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

Aquí tanto "numr" como "denr" son enteros sin signo.

Sarath Kumar
fuente
0

Usar Math.Round(number)redondea al número entero más cercano.

codejockie
fuente
0

Escribe tu propio método circular. Algo como,

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

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